Linux

如何列出所有目前登錄的使用者?

  • November 2, 2020

我有一個我正在管理的系統(執行 RHEL 8),它在我們的小辦公室中有多個使用者,他們以各種方式登錄它——在控制臺本地登錄,通過 SSH 和 NoMachine Workstation 遠端登錄。當我進行包含新核心的更新時,或​​者由於某些其他原因我需要重新啟動機器時,我想確保目前沒有登錄使用者,所以我不會打斷正在執行軟體的使用者機器。

所以我想要的是一個列出所有目前登錄使用者的命令。

我已經對這個主題進行了很多搜尋,而我在回答這個問題時發現的方法是完全錯誤的,因為它們被證明是行不通的。

命令whowusers列出所有登錄使用者。在我寫這篇文章時,目前有三個使用者登錄到有問題的電腦,包括我自己。這些命令只列出了這三個中的一個(順便說一句,我不是其中之一)。這些命令列出的一個使用者通過 SSH 登錄並擁有一個打開的終端。另一個沒有 TTY 但打開了幾個 GUI 應用程序的使用者沒有出現,他們的 X 顯示器通過 SSH 連接到他的筆記型電腦,我也沒有出現(我通過 NoMachine 進行了圖形登錄)。事實上,who -m當我執行它時不返回任何輸出。我可以使用ps -ef列出所有程序並查找目前為所有這些使用者執行的程序。

該命令last | grep 'still logged in'在此處建議)導致與上述相同的不完整列表(它從同一來源獲取其資訊)。

那麼,重複這個問題——獲取所有登錄使用者(通過正常機制進行身份驗證的使用者,並且目前在其使用者 ID 下執行互動式程序的使用者)列表的最終方法是什麼?我想在不搜尋ps.

編輯——這個工作站上的使用者都通過 LDAP 進行身份驗證,但是我已經驗證這與問題無關。我創建了一個本地使用者帳戶,該帳戶也不會在響應whousers通過上述相同方式登錄時顯示。

鑑於想要重新啟動 Linux 系統的背景,我會採取多管齊下的方法。

首先,通過創建一個/etc/nologin文件來禁用以後的登錄。您可以將其留空或在其中輸入資訊性文本,例如:

“為了準備重新啟動伺服器,該系統的登錄已被暫時禁用,計劃在(時間和日期)進行。請在(預計結束時間)之後重試。”

完成後不要忘記刪除 /etc/nologin !

此外,由於重新啟動將清除所有程序,無論它們是否是互動式的,我會使用它ps來查找使用者擁有的程序。這將需要一些人工調查來確定這些流程是否值得保留,但應該縮小範圍。我在這裡硬編碼 1000 作為 /etc/login.defs 中的 UID_MIN 的值,作為“系統”與“使用者”UID 的截止值。如果您的任何使用者的 UID 低於 1000,則您需要調整該數字。

ps -eo pid,uid,args | awk '$2 >= 1000'

當然,您可以ps根據口味調整列,也許添加翻譯後的使用者名和程序開始時間 ( ps -eo pid,uid,user,start,args) 或其他 - 只需注意保持psUID 和awk欄位彼此同步。

要獲取唯一使用者名列表,請使用:

ps -eo user,uid | awk 'NR>1 && $2 >= 1000 && ++seen[$2]==1{print $1}'

引用自:https://unix.stackexchange.com/questions/617652