如何在 Linux 中監控用戶活動
作為一位 Linux 管理員,你需要跟蹤所有用戶的活動。當伺服器發生故障時,你可以分析和查看用戶活動,以便尋找問題的根源。監控 Linux 用戶有多種方式。本指南將專門討論 GNU 記賬工具,這是一項用於監視 Linux 用戶活動的實用工具。
什麼是記賬工具?
記賬工具可以提供諸如 Linux 系統中的連接、已執行的程序以及系統資源的使用等有底系統使用信息。這些記賬工具可以通過 psacct
或 acct
軟體包安裝。
psacct
和 acct
實際上是相同的。在基於 RPM 的系統中,它以 psacct
的形式存在;而在基於 DEB 的系統中,它作為 acct
提供。
你可能想知道 psacct
或 acct
工具的作用。通常,用戶在命令行的歷史記錄會保存在他們的 $HOME
目錄下的 .bash_history
文件中。有些用戶可能會嘗試編輯、修改或刪除這些歷史記錄。
然而,即使他們完全 清除了命令行歷史,記賬工具依然能夠獲取用戶活動信息。這是因為,所有進程記賬文件都由 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
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
1.3、獲取各個用戶的總連接時間
使用 -p
參數,你可以查看每位用戶各自在系統中總的連接時長。
$ ac -p
示例輸出:
ostechnix 52.85
root 0.51
total 53.36
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
如需更多詳情,可參考手冊頁面。
$ 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 記賬實用程序,以便注意所有用戶的行為。在故障排除時,這些實用程序會非常有幫助。
資源
(題圖:MJ/da3f7e79-2a53-4121-a2ed-d63a22c3d3f4)
via: https://ostechnix.com/monitor-user-activity-linux/
作者:sk 選題:lkxed 譯者:ChatGPT 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive