Shell-Script
如何在圖形 Linux 桌面會話上返回目前活動的使用者/會話?
我的問題是如何獲取目前正在使用 Linux 桌面的 shell 上的使用者名(在“普通”桌面系統上,您通常只有一個活動使用者,即這裡沒有伺服器系統,但只有您常用的筆記型電腦等.)。如果您真的想想像一個伺服器系統,我可以列出所有活動使用者。
因此,例如,腳本作為 cron 作業(或類似作業)以 root 身份執行,並且我想獲取系統上的/所有目前活動使用者。
我知道我可以使用
w
orwho
來users
獲取目前登錄的使用者。沒關係,但是該使用者已登錄並不意味著他們實際上正在使用桌面,因為在我知道的所有桌面環境中,使用者可以在登錄後切換到另一個使用者。我也可以
last
用來獲取最後登錄,但這也不能保證該使用者仍然是活動使用者。那麼如何做到這一點呢?可以為不同的桌面環境(GNOME、KDE 等)提供特定的解決方案,但當然,最好使用交叉兼容的解決方案。
在許多目前發行版中,登錄會話(圖形和非圖形)由
logind
. 您可以使用列出會話loginctl list-sessions
然後使用顯示每個會話的屬性
loginctl show-session ${SESSIONID}
或者
loginctl session-status ${SESSIONID}
(酌情更換
${SESSIONID}
);兩種變體之間的區別在於show-session
設計為易於解析,session-status
設計用於人類消費。活動會話由它們的狀態標識;您可以直接使用查詢loginctl show-session -p State ${SESSIONID}
這將輸出
State=active
對於活動會話。完整的
show-session
輸出將告訴您連接了哪個使用者、正在使用哪個 TTY、是否是遠端會話、是否是圖形會話等。請注意
logind
,如果系統配置有多個席位,或者存在遠端會話,則可以有多個活動會話。把這一切放在一起,
for sessionid in $(loginctl list-sessions --no-legend | awk '{ print $1 }') do loginctl show-session -p Id -p Name -p User -p State -p Type -p Remote $sessionid done
將提供您確定哪些會話處於活動狀態以及誰在使用它們所需的所有資訊,並且
for sessionid in $(loginctl list-sessions --no-legend | awk '{ print $1 }') do loginctl show-session -p Id -p Name -p User -p State -p Type -p Remote $sessionid | sort done | awk -F= '/Name/ { name = $2 } /User/ { user = $2 } /State/ { state = $2 } /Type/ { type = $2 } /Remote/ { remote = $2 } /User/ && remote == "no" && state == "active" && (type == "x11" || type == "wayland") { print user, name }'
將使用圖形會話列印所有活動使用者的標識符和登錄名。
該
LockedHint
屬性現在指示給定會話是否已鎖定,因此for sessionid in $(loginctl list-sessions --no-legend | awk '{ print $1 }') do loginctl show-session -p Id -p Name -p User -p State -p Type -p Remote -p LockedHint $sessionid | sort done | awk -F= '/Name/ { name = $2 } /User/ { user = $2 } /State/ { state = $2 } /Type/ { type = $2 } /Remote/ { remote = $2 } /LockedHint/ { locked = $2 } /User/ && remote == "no" && state == "active" && (type == "x11" || type == "wayland") { print user, name, locked == "yes" ? "locked" : "unlocked" }'
還將指示活動會話是否被鎖定。