TranslateProject/published/202310/20221013 How To Monitor User Activity In Linux.md
2023-11-01 21:54:16 +08:00

483 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[#]: subject: "How To Monitor User Activity In Linux"
[#]: via: "https://ostechnix.com/monitor-user-activity-linux/"
[#]: author: "sk https://ostechnix.com/author/sk/"
[#]: collector: "lkxed"
[#]: translator: "ChatGPT"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-16297-1.html"
如何在 Linux 中监控用户活动
======
![][0]
作为一位 Linux 管理员,你需要跟踪所有用户的活动。当服务器发生故障时,你可以分析和查看用户活动,以便寻找问题的根源。监控 Linux 用户有多种方式。本指南将专门讨论 **GNU 记账工具**,这是一项用于监视 Linux 用户活动的实用工具。
### 什么是记账工具?
记账工具可以提供诸如 Linux 系统中的连接、已执行的程序以及系统资源的使用等有底系统使用信息。这些记账工具可以通过 `psacct``acct` 软件包安装。
`psacct``acct` 实际上是相同的。在基于 RPM 的系统中,它以 `psacct` 的形式存在;而在基于 DEB 的系统中,它作为 `acct` 提供。
你可能想知道 `psacct``acct` 工具的作用。通常,用户在命令行的历史记录会保存在他们的 `$HOME` 目录下的 `.bash_history` 文件中。有些用户可能会尝试编辑、修改或删除这些历史记录。
然而,即使他们完全 [清除了命令行历史][1],记账工具依然能够获取用户活动信息。这是因为,**所有进程记账文件都由 root 用户拥有**,而普通用户则无法进行编辑。
### Linux 中如何安装 psacct 或 acct
`psacct`/`acct` 被打包在多种流行的 Linux 发行版本中。
如果要在 Alpine Linux 中安装 `psacct`,请运行以下命令:
```
$ sudo apk add psacct
```
如果在 Arch Linux 及其变体版本(如 EndeavourOS 和 Manjaro Linux中安装 `acct`,请运行以下命令:
```
$ sudo pacman -S acct
```
在 Fedora、RHEL 及其衍生版本(如 CentOS、AlmaLinux 和 Rocky Linux中安装 `psacct`,请运行以下命令:
```
$ sudo dnf install psacct
```
在 RHEL 6 以及更早版本中,你应当使用 `yum` 命令而非 `dnf` 来安装 `psacct`
```
$ sudo yum install psacct
```
在 Debian、Ubuntu 以及 Linux Mint 中,通过如下命令来安装 `acct`
```
$ sudo apt install acct
```
若在 openSUSE 中安装 `acct`,则运行:
```
$ sudo zypper install acct
```
### 启动 psacct/acct 服务
要启用并开启 `psacct` 服务,请执行以下命令:
```
$ sudo systemctl enable psacct
```
接着启动 `psacct` 服务:
```
$ sudo systemctl start psacct
```
如果你需要检查 `psacct` 服务是否已加载和激活,可以运行:
```
$ sudo systemctl status psacct
```
在基于 DEB 的系统中,安装完成之后,`acct` 服务会自动启动。
如果你想验证 `acct` 服务是否已经启动,可以执行以下命令:
```
$ sudo systemctl status acct
```
```
● acct.service - Kernel process accounting
Loaded: loaded (/lib/systemd/system/acct.service; enabled; vendor preset: enabled)
Active: active (exited) since Thu 2022-10-13 16:06:35 IST; 28s ago
Docs: man:accton(8)
Process: 3241 ExecStart=/usr/sbin/accton /var/log/account/pacct (code=exited, status=0/SUCCESS)
Main PID: 3241 (code=exited, status=0/SUCCESS)
CPU: 879us
Oct 13 16:06:35 ubuntu2204 systemd[1]: Starting Kernel process accounting...
Oct 13 16:06:35 ubuntu2204 accton[3241]: Turning on process accounting, file set to '/var/log/account/pacct'.
Oct 13 16:06:35 ubuntu2204 systemd[1]: Finished Kernel process accounting.
```
### 利用 psacct 或 acct 来监测 Linux 中的用户活动
`psacct`(进程记账)软件包包含以下用来监测用户和进程活动的工具:
* `ac` - 提供用户登录时间的统计信息。
* `lastcomm` - 展示先前执行过的命令的信息。
* `accton` - 开启或关闭进程记账。
* `dump-acct` - 把 `accton` 的输出文件转化为易读的格式。
* `dump-utmp` - 以易读的方式打印 `utmp` 文件。
* `sa` - 汇总信息,关于先前执行的命令。
现在就让我们一起了解如何通过每个工具来监控 Linux 用户的活动。
#### 1、使用 ac 命令
`ac` 工具可以为你提供以小时为单位的连接时间报告,这样你就能知道用户或一组用户连接到系统的时长。
##### 1.1、展示所有用户的总连接时间
```
$ ac
```
上述命令会显示所有用户的总连接时间(单位为小时)。
```
total 52.91
```
![展示所有用户的总连接时间][3]
##### 1.2、按日期排序显示所有用户的总连接时间
你可以通过使用 `-d` 参数,按日期排序显示所有用户的连接时间,操作如下:
```
$ ac -d
```
示例输出:
```
May 11 total 4.29
May 13 total 3.23
May 14 total 7.66
May 15 total 8.97
May 16 total 0.52
May 20 total 4.09
May 24 total 1.32
Jun 9 total 15.18
Jun 10 total 2.97
Jun 22 total 2.61
Jul 19 total 1.95
Today total 0.29
```
![按日期排序显示所有用户的总时间][4]
##### 1.3、获取各个用户的总连接时间
使用 `-p` 参数,你可以查看每位用户各自在系统中总的连接时长。
```
$ ac -p
```
示例输出:
```
ostechnix 52.85
root 0.51
total 53.36
```
![获取各个用户的总连接时间][5]
##### 1.4、显示指定用户的总连接时间
你还可以显示特定用户的总登录时间。
```
$ ac ostechnix
```
示例输出:
```
total 52.95
```
##### 1.5、显示特定用户各日期的总连接时间
要按日期查看某个用户的登录时间,可以运行:
```
$ ac -d ostechnix
```
示例输出:
```
May 11 total 4.29
May 13 total 3.23
May 14 total 7.66
May 15 total 8.97
May 16 total 0.01
May 20 total 4.09
May 24 total 1.32
Jun 9 total 15.18
Jun 10 total 2.97
Jun 22 total 2.61
Jul 19 total 1.95
Today total 0.68
```
![显示某个用户各日期的总连接时间][6]
如需更多详情,可参考手册页面。
```
$ man ac
```
#### 2、lastcomm 命令使用示例
`lastcomm` 工具用于列出过去执行过的命令,它会按执行的最近程度将命令列在前面。
##### 2.1、展示过去执行的命令
```
$ lastcomm
```
示例输出:
```
systemd-hostnam S root __ 0.06 secs Thu Oct 13 17:21
systemd-localed S root __ 0.06 secs Thu Oct 13 17:22
bash F ostechni pts/1 0.00 secs Thu Oct 13 17:22
awk ostechni pts/1 0.00 secs Thu Oct 13 17:22
bash F ostechni pts/1 0.00 secs Thu Oct 13 17:22
uname ostechni pts/1 0.00 secs Thu Oct 13 17:22
bash F ostechni pts/1 0.00 secs Thu Oct 13 17:22
sed ostechni pts/1 0.00 secs Thu Oct 13 17:22
bash F ostechni pts/1 0.00 secs Thu Oct 13 17:22
bash F ostechni pts/1 0.00 secs Thu Oct 13 17:22
grep ostechni pts/1 0.00 secs Thu Oct 13 17:22
bash F ostechni pts/1 0.00 secs Thu Oct 13 17:22
bash F ostechni pts/1 0.00 secs Thu Oct 13 17:22
grep ostechni pts/1 0.00 secs Thu Oct 13 17:22
bash F ostechni pts/1 0.00 secs Thu Oct 13 17:22
bash F ostechni pts/1 0.00 secs Thu Oct 13 17:22
[...]
```
##### 2.2、打印特定用户先前执行的命令
上述命令显示的是所有用户的命令。要显示特定用户以前执行的命令,可以使用下面的命令:
```
$ lastcomm ostechnix
```
示例输出:
```
less ostechni pts/1 0.00 secs Thu Oct 13 17:26
lastcomm ostechni pts/1 0.00 secs Thu Oct 13 17:26
lastcomm ostechni pts/1 0.00 secs Thu Oct 13 17:26
lastcomm ostechni pts/1 0.00 secs Thu Oct 13 17:26
gdbus X ostechni __ 0.00 secs Thu Oct 13 17:24
lastcomm ostechni pts/1 0.00 secs Thu Oct 13 17:24
ac ostechni pts/1 0.00 secs Thu Oct 13 17:24
update-notifier F ostechni __ 0.00 secs Thu Oct 13 17:23
apport-checkrep ostechni __ 0.06 secs Thu Oct 13 17:23
apport-checkrep ostechni __ 0.05 secs Thu Oct 13 17:23
systemctl ostechni __ 0.00 secs Thu Oct 13 17:23
apt-check ostechni __ 0.81 secs Thu Oct 13 17:23
dpkg ostechni __ 0.00 secs Thu Oct 13 17:23
ischroot ostechni __ 0.00 secs Thu Oct 13 17:23
dpkg ostechni __ 0.00 secs Thu Oct 13 17:23
[...]
```
##### 2.3、打印特定命令的执行次数
你还可以查看特定命令被执行的次数。
```
$ lastcomm apt
```
示例输出:
```
apt S root pts/2 0.70 secs Thu Oct 13 16:06
apt F root pts/2 0.00 secs Thu Oct 13 16:06
apt F root pts/2 0.00 secs Thu Oct 13 16:06
```
如上述输出所示root 用户执行了 `apt` 命令三次。
更详细的信息,可参考手册页:
```
$ man lastcomm
```
#### 3、sa 命令示例
`sa` 实用程序将总结关于先前执行的命令的信息。
##### 3.1、打印所有命令的总结
```
$ sa
```
示例输出:
```
1522 1598.63re 0.23cp 0avio 32712k
139 570.90re 0.05cp 0avio 36877k ***other*
38 163.63re 0.05cp 0avio 111445k gdbus
3 0.05re 0.04cp 0avio 12015k apt-check
27 264.27re 0.02cp 0avio 0k kworker/dying*
2 51.87re 0.01cp 0avio 5310464k Docker Desktop
5 0.03re 0.01cp 0avio 785k snap-confine
8 59.48re 0.01cp 0avio 85838k gmain
5 103.94re 0.01cp 0avio 112720k dconf worker
24 3.38re 0.00cp 0avio 2937k systemd-udevd*
7 0.01re 0.00cp 0avio 36208k 5
3 1.51re 0.00cp 0avio 3672k systemd-timedat
2 0.00re 0.00cp 0avio 10236k apport-checkrep
2 0.01re 0.00cp 0avio 4316160k ThreadPoolForeg*
2 0.00re 0.00cp 0avio 8550k package-data-do
3 0.79re 0.00cp 0avio 2156k dbus-daemon
12 0.00re 0.00cp 0avio 39631k ffmpeg
[...]
```
##### 3.2、查看进程数量和 CPU 分钟数
要打印基于每个用户的进程数量和 CPU 分钟数,运行带 `-m` 标志的 `sa` 命令:
```
$ sa -m
```
示例输出:
```
1525 1598.63re 0.23cp 0avio 32651k
root 561 647.23re 0.09cp 0avio 3847k
ostechnix 825 780.79re 0.08cp 0avio 47788k
gdm 117 13.43re 0.06cp 0avio 63715k
colord 2 52.01re 0.00cp 0avio 89720k
geoclue 1 1.01re 0.00cp 0avio 70608k
jellyfin 12 0.00re 0.00cp 0avio 39631k
man 1 0.00re 0.00cp 0avio 3124k
kernoops 4 104.12re 0.00cp 0avio 3270k
sshd 1 0.05re 0.00cp 0avio 3856k
whoopsie 1 0.00re 0.00cp 0avio 8552k
```
##### 3.3、打印用户 ID 和命令名称
对于账户文件中的每个命令,使用 `-u` 标志打印用户 ID 和命令名称。
```
$ sa -u
```
示例输出:
```
root 0.00 cpu 693k mem 0 io accton
root 0.00 cpu 3668k mem 0 io systemd-tty-ask
root 0.00 cpu 3260k mem 0 io systemctl
root 0.01 cpu 3764k mem 0 io deb-systemd-inv
root 0.00 cpu 722k mem 0 io acct.postinst
root 0.00 cpu 704k mem 0 io rm
root 0.00 cpu 939k mem 0 io cp
root 0.00 cpu 704k mem 0 io rm
root 0.00 cpu 951k mem 0 io find
root 0.00 cpu 911k mem 0 io gzip
root 0.00 cpu 722k mem 0 io sh
root 0.00 cpu 748k mem 0 io install-info
root 0.00 cpu 911k mem 0 io gzip
[...]
```
如需更多详细信息,请参考手册页:
```
$ man sa
```
#### 4、dump-acct 和 dump-utmp 命令
`dump-acct` 实用工具将 accton 格式的输出文件显示为人类可读的格式。
```
$ dump-acct /var/account/pacct
```
`dump-utmp` 将 utmp 文件显示为人类可读的格式。
```
$ dump-utmp /var/run/utmp
```
如需了解更多详情,请参考手册页:
```
$ man dump-acct
```
```
$ man dump-utmp
```
#### 5、accton 命令
`accton` 命令将允许你开启或关闭记账。
要开启进程记账,请运行:
```
$ accton on
```
要关闭它,运行:
```
$ accton off
```
如需了解更多详情,请参考手册页:
```
$ man accton
```
### 总结
每个 Linux 管理员都应该知道 GNU 记账实用程序,以便注意所有用户的行为。在故障排除时,这些实用程序会非常有帮助。
### 资源
* [GNU 记账实用程序官网][7]
*题图MJ/da3f7e79-2a53-4121-a2ed-d63a22c3d3f4*
--------------------------------------------------------------------------------
via: https://ostechnix.com/monitor-user-activity-linux/
作者:[sk][a]
选题:[lkxed][b]
译者:[ChatGPT](https://linux.cn/lctt/ChatGPT)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://ostechnix.com/author/sk/
[b]: https://github.com/lkxed
[1]: https://ostechnix.com/how-to-clear-command-line-history-in-linux/
[2]: https://ostechnix.tradepub.com/free/w_syst04/prgm.cgi
[3]: https://ostechnix.com/wp-content/uploads/2022/10/Display-total-connect-time-of-all-users.png
[4]: https://ostechnix.com/wp-content/uploads/2022/10/Show-total-connect-of-all-users-by-day-wise.png
[5]: https://ostechnix.com/wp-content/uploads/2022/10/Get-total-connect-time-by-user-wise.png
[6]: https://ostechnix.com/wp-content/uploads/2022/10/View-total-connect-time-of-a-certain-user-by-day-wise.png
[7]: https://www.gnu.org/software/acct/manual/accounting.html
[0]: https://img.linux.net.cn/data/attachment/album/202310/19/105911voe22858b5o7287s.jpg