私の質問は、現在Linuxデスクトップを使用しているシェルからユーザー名を取得する方法です(「一般」デスクトップシステムでは通常、アクティブなユーザーは1人しかいません。つまり、サーバーシステムはなく、一般的なノートブックのみです)。本当にサーバーシステムを想像したい場合は、すべてを一覧表示できます。ポジティブユーザー。
したがって、cronジョブ(または同様のジョブ)でrootとして実行されるスクリプトの場合は、システムの現在/すべてのアクティブユーザーをインポートしたいと思います。
現在ログインしているユーザーを使用またはインポートできることw
を知っています。大丈夫です。しかし、ユーザーがログインしても実際に現在ログインしているという意味ではありません。who
users
使用デスクトップ、私が知っているすべてのデスクトップ環境では、ユーザーはログイン後に他のユーザーに切り替えることができるからです。
また、これを使用して最後にログインしたユーザーをインポートすることもできますがlast
、これはまだアクティブなユーザーであることを保証しません。
ではどうすればいいですか?さまざまなデスクトップ環境(GNOME、KDEなど)に特定のソリューションを持つことは大丈夫ですが、もちろん、互換性のあるソリューションが好まれます。
答え1
現在、多くの展開では、ログインセッション(グラフィックスと非グラフィックス)は次のように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" }'
また、アクティブセッションがロックされているかどうかを示します。
答え2
以下のように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サーバーを含めることができる場合は、どのサーバーから始めるべきかをもっと注意する必要があります。
答え3
ほとんどのUnixシリーズシステム(例:ウィキペディア)注文する
$ whoami
コマンドを実行している現在のユーザーの名前を指定します。
$ whoami
dessert
$ sudo whoami
root