Linux中國

如何在 Linux 中監控用戶活動

作為一位 Linux 管理員,你需要跟蹤所有用戶的活動。當伺服器發生故障時,你可以分析和查看用戶活動,以便尋找問題的根源。監控 Linux 用戶有多種方式。本指南將專門討論 GNU 記賬工具,這是一項用於監視 Linux 用戶活動的實用工具。

什麼是記賬工具?

記賬工具可以提供諸如 Linux 系統中的連接、已執行的程序以及系統資源的使用等有底系統使用信息。這些記賬工具可以通過 psacctacct 軟體包安裝。

psacctacct 實際上是相同的。在基於 RPM 的系統中,它以 psacct 的形式存在;而在基於 DEB 的系統中,它作為 acct 提供。

你可能想知道 psacctacct 工具的作用。通常,用戶在命令行的歷史記錄會保存在他們的 $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

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國