如何列出所有目前登錄的使用者?
我有一個我正在管理的系統(執行 RHEL 8),它在我們的小辦公室中有多個使用者,他們以各種方式登錄它——在控制臺本地登錄,通過 SSH 和 NoMachine Workstation 遠端登錄。當我進行包含新核心的更新時,或者由於某些其他原因我需要重新啟動機器時,我想確保目前沒有登錄使用者,所以我不會打斷正在執行軟體的使用者機器。
所以我想要的是一個列出所有目前登錄使用者的命令。
我已經對這個主題進行了很多搜尋,而我在回答這個問題時發現的方法是完全錯誤的,因為它們被證明是行不通的。
命令
who
、w
和users
不列出所有登錄使用者。在我寫這篇文章時,目前有三個使用者登錄到有問題的電腦,包括我自己。這些命令只列出了這三個中的一個(順便說一句,我不是其中之一)。這些命令列出的一個使用者通過 SSH 登錄並擁有一個打開的終端。另一個沒有 TTY 但打開了幾個 GUI 應用程序的使用者沒有出現,他們的 X 顯示器通過 SSH 連接到他的筆記型電腦,我也沒有出現(我通過 NoMachine 進行了圖形登錄)。事實上,who -m
當我執行它時不返回任何輸出。我可以使用ps -ef
列出所有程序並查找目前為所有這些使用者執行的程序。該命令
last | grep 'still logged in'
(在此處建議)導致與上述相同的不完整列表(它從同一來源獲取其資訊)。那麼,重複這個問題——獲取所有登錄使用者(通過正常機制進行身份驗證的使用者,並且目前在其使用者 ID 下執行互動式程序的使用者)列表的最終方法是什麼?我想在不搜尋
ps
.編輯——這個工作站上的使用者都通過 LDAP 進行身份驗證,但是我已經驗證這與問題無關。我創建了一個本地使用者帳戶,該帳戶也不會在響應
who
或users
通過上述相同方式登錄時顯示。
鑑於想要重新啟動 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
) 或其他 - 只需注意保持ps
UID 和awk
欄位彼此同步。要獲取唯一使用者名列表,請使用:
ps -eo user,uid | awk 'NR>1 && $2 >= 1000 && ++seen[$2]==1{print $1}'