私の質問は、現在Linuxデスクトップを使用しているシェルのユーザー名を取得する方法です(「通常の」デスクトップシステムでは、通常、アクティブなユーザーは1人だけです。つまり、ここにサーバーシステムはなく、通常のラップトップだけです) 。)。サーバーシステムを本当に想像したい場合は、すべてのactiveユーザーをリストすることで問題ありません。
したがって、例えばスクリプトがcronジョブ(または同様のジョブ)としてrootとして実行されており、システムで現在アクティブなすべてのユーザーを取得したい場合。
w
またはwho
またはusers
を使用して、現在ログインしているユーザーを取得できることはわかっています。それは問題ありませんが、そのユーザーがログインしているということは、そのユーザーが実際に現在singデスクトップであることを意味するわけではありません。last
を使用して、最後にログインしたユーザーを取得することもできますが、これは、このユーザーがまだアクティブなユーザーであることを保証するものではありません。
それで、これをどうやって行うことができますか?異なるデスクトップ環境(GNOME、KDEなど)に特定のソリューションを提供することは問題ありませんが、もちろん、相互互換性のあるソリューションが推奨されます。
現在の多くのディストリビューションでは、ログインセッション(グラフィカルおよび非グラフィカル)はlogind
によって管理されています。を使用してセッションを一覧表示できます
loginctl list-sessions
次に、各セッションのプロパティを使用して表示します
loginctl show-session ${SESSIONID}
または
loginctl session-status ${SESSIONID}
(必要に応じて${SESSIONID}
を置き換えます); 2つのバリアントの違いは、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" }'
また、アクティブなセッションがロックされているかどうかも示します。
次のようなbash関数を使用しています
function Xowner() {
for pid in $(ps -houid --ppid $(ps -hoppid $(pgrep X))) ; do
[ "$pid" = "0" ] && continue
id -n -u $pid
break
done
}
この関数の目的は、基本的に、Xserverの兄弟プロセスの「最初の」非ルートUIDを選択することです。見る man ps
詳細については。ユースケースに複数のXサーバーが含まれる可能性がある場合は、どのサーバーから開始するかをより集中して検討する必要があると思います。
ほとんどのUnixライクなシステム(たとえば Wikipedia )では、コマンド
$ whoami
コマンドを実行している現在のユーザーの名前を示します。
$ whoami
dessert
$ Sudo whoami
root