私は、小規模オフィスでローカルコンソール、SSH、およびNoMachine Workstationを介してリモートでさまざまな方法でシステムにログインする複数のユーザーを持つシステム(RHEL 8を実行)を管理しています。新しいカーネルを含むアップデートを実行したり、他の理由でコンピュータを再起動する必要がある場合は、現在ログインしているユーザーがいないことを確認して、ソフトウェアを実行しているユーザーのコンピュータをクラッシュさせないようにしたいと思います。
そのため、現在ログインしているすべてのユーザーを一覧表示するコマンドが必要です。
私はこのトピックについて多くの検索をしてきましたが、この質問に答えるために私が見つけた方法はうまくいかないことが証明されているので、完全に間違っています。
命令しwho
、実行するw
users
いいえリストログインしたすべてのユーザー。この記事を書いている現在の問題のコンピュータには、私を含む3人のユーザーがログインしています。このコマンドはこれら3つのうちの1つだけをリストします(しかし私はそれらの1つではありません)。このコマンドはSSHを介してログインし、端末が開いているユーザーを一覧表示します。他のユーザーはTTYを持っていませんが、複数のGUIアプリケーションが開いていて、彼のXはSSHを介してラップトップに表示されますが、表示されず、私も表示されません(NoMachine経由でグラフィカルログインがあります)。実際にwho -m
実行すると、出力は返されません。これを使用してps -ef
すべてのプロセスを一覧表示し、すべてのユーザーに対して現在実行中のプロセスを見つけることができます。
コマンドlast | grep 'still logged in'
(提案ここ)は上記と同じ不完全なリストを生成します(同じソースから情報を取得します)。
もしそうなら、質問を繰り返すと、ログインしたすべてのユーザー(一般的なメカニズムを介して認証し、現在のユーザーIDで実行されている対話型プロセスを持つユーザー)のリストを取得する究極の方法は何ですか?検索結果なしでこれを実行したいと思いますps
。
編集 - このワークステーションのユーザーはすべてLDAPを介して認証されていますが、これが問題とは関係がないことを確認しました。上記と同じ方法で応答またはwho
ログインusers
したときに表示されないローカルユーザーアカウントを作成しました。
答え1
Linuxシステムを再起動する状況を考慮して、多面的なアプローチをとります。
まず、ファイルを作成して将来のログインを無効にします/etc/nologin
。空白のままにするか、次の情報テキストを入力できます。
「サーバーの再起動を準備するために、このシステムへのログインが一時的に無効になっており、再起動が(時刻と日付)に予定されています。(予期終了時間)後に再試行してください。
作業が終わったら/etc/nologinを削除することを忘れないでください!
また、再起動するとクリアされるのでみんなインタラクティブであるかどうかにかかわらず、プロセスはps
ユーザーが所有するプロセスを見つけるために使用されます。これを行うには、これらのプロセスを維持する価値があるかどうかを判断するためにいくつかの手動調査が必要ですが、範囲を狭める必要があります。ここでは、「システム」と「ユーザー」のUIDのカットオフで、/etc/login.defsのUID_MIN値で1000をハードコーディングしました。ユーザーのUIDが1000未満の場合は、その番号を調整する必要があります。
ps -eo pid,uid,args | awk '$2 >= 1000'
もちろん、ps
熱を好きなように調整できます。翻訳されたユーザー名とプロセス開始時間()などを追加することもできます。ただし、UIDとフィールドを互いに同期させるps -eo pid,uid,user,start,args
ように注意してください。ps
awk
一意のユーザー名のリストを取得するには、次のようにします。
ps -eo user,uid | awk 'NR>1 && $2 >= 1000 && ++seen[$2]==1{print $1}'
答え2
出力を見たくないとおっしゃったのは分かりますが、ps
出力を自動化できたらどうでしょうか?
$ join <(ps -aux | tail -n+2 | cut -d' ' -f1 | sort -u) \
<(getent passwd | grep -f <(grep '^/' /etc/shells) | cut -d: -f1 | sort)
root
terdon
少し複雑に見えるかもしれませんが、詳細を見ると次のようになります。
ps -aux | tail -n+2 | cut -d' ' -f1 | sort -u
:すべてのユーザーを表示するプロセスを実行し、最初の行以降のすべての行が印刷される出力をps
渡すtail -n+2
ので、ヘッダーをフィルタリングしps
てからcut
ユーザー名を印刷し、ユーザー名のリストを渡してソートsort -u
結果を取得します。 、重複排除リスト。
getent passwd | grep -f <(grep '^/' /etc/shells) | cut -d: -f1 | sort
:ここでは、/etc/shells
スラッシュで始まるすべての行を選択し(有効なログインシェルのリストを提供する必要があります)、既知のユーザー(LDAPユーザーを含める必要があります)の出力を取得するシェルへgrep
の入力として使用します。上記の結果は、実際のシェル(またはgetent passwod
その他など)を使用しているユーザーのリストでなければなりません。/usr/bin/nologin
/bin/false
最後に、両方のコマンドの出力が入力として提供され、join
出力ps
と有効なログインシェルを使用するユーザーのリストの両方にあるユーザーのみが印刷されます。
~/.bashrc
これが有効な場合は、次を実行している場合はシェルの初期化ファイルに追加してエイリアスにbash
設定できます。
alias getUsers="join <(ps -aux | tail -n+2 | cut -d' ' -f1 | sort -u) <(getent passwd | grep -f <(grep '^/' /etc/shells) | cut -d: -f1 | sort)"
これは完璧ではなく、一部のシステムユーザーにはまだ影響を与える可能性があります。たとえば、私のシステムには次のものがありますgit
。
$ getent passwd | grep git
git:x:996:996:git daemon user:/:/bin/bash
このユーザーがいつログインしているのかはわかりません。おそらくいくつかのgit
コマンドを実行している間?とにかく、完璧とは遠いですが、少なくとも一時的な回避策になることができます。