如何在 Linux 中監(jiān)控用戶活動(dòng)
作為一位 Linux 管理員,你需要跟蹤所有用戶的活動(dòng)。當(dāng)服務(wù)器發(fā)生故障時(shí),你可以分析和查看用戶活動(dòng),以便尋找問(wèn)題的根源。監(jiān)控 Linux 用戶有多種方式。什么是記賬工具?
記賬工具可以提供諸如 Linux 系統(tǒng)中的連接、已執(zhí)行的程序以及系統(tǒng)資源的使用等有底系統(tǒng)使用信息。這些記賬工具可以通過(guò) psacct
或 acct
軟件包安裝。
psacct
和 acct
實(shí)際上是相同的。在基于 RPM 的系統(tǒng)中,它以 psacct
的形式存在;而在基于 DEB 的系統(tǒng)中,它作為 acct
提供。
你可能想知道 psacct
或 acct
工具的作用。通常,用戶在命令行的歷史記錄會(huì)保存在他們的 $HOME
目錄下的 .bash_history
文件中。有些用戶可能會(huì)嘗試編輯、修改或刪除這些歷史記錄。
然而,即使他們完全 清除了命令行歷史,記賬工具依然能夠獲取用戶活動(dòng)信息。這是因?yàn)椋?strong>所有進(jìn)程記賬文件都由 root 用戶擁有,而普通用戶則無(wú)法進(jìn)行編輯。
Linux 中如何安裝 psacct 或 acct
psacct
/acct
被打包在多種流行的 Linux 發(fā)行版本中。
如果要在 Alpine Linux 中安裝 psacct
,請(qǐng)運(yùn)行以下命令:
$ sudo apk add psacct
如果在 Arch Linux 及其變體版本(如 EndeavourOS 和 Manjaro Linux)中安裝 acct
,請(qǐng)運(yùn)行以下命令:
$ sudo pacman -S acct
在 Fedora、RHEL 及其衍生版本(如 CentOS、AlmaLinux 和 Rocky Linux)中安裝 psacct
,請(qǐng)運(yùn)行以下命令:
$ sudo dnf install psacct
在 RHEL 6 以及更早版本中,你應(yīng)當(dāng)使用 yum
命令而非 dnf
來(lái)安裝 psacct
。
$ sudo yum install psacct
在 Debian、Ubuntu 以及 Linux Mint 中,通過(guò)如下命令來(lái)安裝 acct
:
$ sudo apt install acct
若在 openSUSE 中安裝 acct
,則運(yùn)行:
$ sudo zypper install acct
啟動(dòng) psacct/acct 服務(wù)
要啟用并開(kāi)啟 psacct
服務(wù),請(qǐng)執(zhí)行以下命令:
$ sudo systemctl enable psacct
接著啟動(dòng) psacct
服務(wù):
$ sudo systemctl start psacct
如果你需要檢查 psacct
服務(wù)是否已加載和激活,可以運(yùn)行:
$ sudo systemctl status psacct
在基于 DEB 的系統(tǒng)中,安裝完成之后,acct
服務(wù)會(huì)自動(dòng)啟動(dòng)。
如果你想驗(yàn)證 acct
服務(wù)是否已經(jīng)啟動(dòng),可以執(zhí)行以下命令:
$ 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 來(lái)監(jiān)測(cè) Linux 中的用戶活動(dòng)
psacct
(進(jìn)程記賬)軟件包包含以下用來(lái)監(jiān)測(cè)用戶和進(jìn)程活動(dòng)的工具:
ac
- 提供用戶登錄時(shí)間的統(tǒng)計(jì)信息。lastcomm
- 展示先前執(zhí)行過(guò)的命令的信息。accton
- 開(kāi)啟或關(guān)閉進(jìn)程記賬。dump-acct
- 把accton
的輸出文件轉(zhuǎn)化為易讀的格式。dump-utmp
- 以易讀的方式打印utmp
文件。sa
- 匯總信息,關(guān)于先前執(zhí)行的命令。
現(xiàn)在就讓我們一起了解如何通過(guò)每個(gè)工具來(lái)監(jiān)控 Linux 用戶的活動(dòng)。
1、使用 ac 命令
ac
工具可以為你提供以小時(shí)為單位的連接時(shí)間報(bào)告,這樣你就能知道用戶或一組用戶連接到系統(tǒng)的時(shí)長(zhǎng)。
1.1、展示所有用戶的總連接時(shí)間
$ ac
上述命令會(huì)顯示所有用戶的總連接時(shí)間(單位為小時(shí))。
total 52.91
展示所有用戶的總連接時(shí)間
展示所有用戶的總連接時(shí)間
1.2、按日期排序顯示所有用戶的總連接時(shí)間
你可以通過(guò)使用 -d
參數(shù),按日期排序顯示所有用戶的連接時(shí)間,操作如下:
$ 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
按日期排序顯示所有用戶的總時(shí)間
按日期排序顯示所有用戶的總時(shí)間
1.3、獲取各個(gè)用戶的總連接時(shí)間
使用 -p
參數(shù),你可以查看每位用戶各自在系統(tǒng)中總的連接時(shí)長(zhǎng)。
$ ac -p
示例輸出:
ostechnix 52.85
root 0.51
total 53.36
獲取各個(gè)用戶的總連接時(shí)間
獲取各個(gè)用戶的總連接時(shí)間
1.4、顯示指定用戶的總連接時(shí)間
你還可以顯示特定用戶的總登錄時(shí)間。
$ ac ostechnix
示例輸出:
total 52.95
1.5、顯示特定用戶各日期的總連接時(shí)間
要按日期查看某個(gè)用戶的登錄時(shí)間,可以運(yùn)行:
$ 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
顯示某個(gè)用戶各日期的總連接時(shí)間
顯示某個(gè)用戶各日期的總連接時(shí)間
如需更多詳情,可參考手冊(cè)頁(yè)面。
$ man ac
2、lastcomm 命令使用示例
lastcomm
工具用于列出過(guò)去執(zhí)行過(guò)的命令,它會(huì)按執(zhí)行的最近程度將命令列在前面。
2.1、展示過(guò)去執(zhí)行的命令
$ 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、打印特定用戶先前執(zhí)行的命令
上述命令顯示的是所有用戶的命令。要顯示特定用戶以前執(zhí)行的命令,可以使用下面的命令:
$ 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、打印特定命令的執(zhí)行次數(shù)
你還可以查看特定命令被執(zhí)行的次數(shù)。
$ 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 用戶執(zhí)行了 apt
命令三次。
更詳細(xì)的信息,可參考手冊(cè)頁(yè):
$ man lastcomm
3、sa 命令示例
sa
實(shí)用程序?qū)⒖偨Y(jié)關(guān)于先前執(zhí)行的命令的信息。
3.1、打印所有命令的總結(jié)
$ 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、查看進(jìn)程數(shù)量和 CPU 分鐘數(shù)
要打印基于每個(gè)用戶的進(jìn)程數(shù)量和 CPU 分鐘數(shù),運(yùn)行帶 -m
標(biāo)志的 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 和命令名稱(chēng)
對(duì)于賬戶文件中的每個(gè)命令,使用 -u
標(biāo)志打印用戶 ID 和命令名稱(chēng)。
$ 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
[...]
如需更多詳細(xì)信息,請(qǐng)參考手冊(cè)頁(yè):
$ man sa
4、dump-acct 和 dump-utmp 命令
dump-acct
實(shí)用工具將 accton 格式的輸出文件顯示為人類(lèi)可讀的格式。
$ dump-acct /var/account/pacct
dump-utmp
將 utmp 文件顯示為人類(lèi)可讀的格式。
$ dump-utmp /var/run/utmp
如需了解更多詳情,請(qǐng)參考手冊(cè)頁(yè):
$ man dump-acct
$ man dump-utmp
5、accton 命令
accton
命令將允許你開(kāi)啟或關(guān)閉記賬。
要開(kāi)啟進(jìn)程記賬,請(qǐng)運(yùn)行:
$ accton on
要關(guān)閉它,運(yùn)行:
$ accton off
如需了解更多詳情,請(qǐng)參考手冊(cè)頁(yè):
$ man accton
總結(jié)
每個(gè) Linux 管理員都應(yīng)該知道 GNU 記賬實(shí)用程序,以便注意所有用戶的行為。在故障排除時(shí),這些實(shí)用程序會(huì)非常有幫助。