web-dev-qa-db-ja.com

wコマンドは、すべての疑似端末セッションを表示するわけではありません

ターミナルを開いてwコマンドを実行すると、次のように表示されます。

user   tty7     :0               12:04   39:56  36.87s  0.06s /sbin/upstart -

ここで、terminatorまたはxtermを開いてwコマンドを実行すると、次のようにwコマンドの出力にそのエントリが表示されます。

user   tty7     :0               12:04   39:56  36.87s  0.06s 
/sbin/upstart -
user   pts/2    :0.0             12:50    1.00s  0.02s  0.00s w

しかし、gnome-terminalまたはxfce4-terminalを開くと、新しいエントリは表示されません。 xfce4-terminalではなくターミネーターの新しいセッションが表示されるのはなぜですか?

1
Prvt_Yadav

wは、utmpに保存されている情報を表示します(/var/run/utmp通常はLinuxシステム)。これは通常、「ログイン」セッションielogin(仮想コンソールまたはシリアル接続でのログイン用)、ディスプレイマネージャーによってのみ更新されます。 (グラフィカルセッション用)、SSHサーバー(SSH接続用)、およびいくつかの(ほとんど?)ターミナルエミュレーター。後者の場合、utmpを更新するかどうかは、組み込みのサポートと構成によって異なります。たとえば、xtermにはこのためのutフラグがあります(-ututmp更新を無効にし、+utはそれらを有効にします)、そしてGNOMEターミナル もはやutmpを直接更新しません

つまり、あなたのケースではutmpに追加されたエントリが表示されています:ディスプレイマネージャによって追加されたエントリ(tty7)、および使用しているターミナルエミュレータの一部によって追加されたもの。

コマンドをラップして、たとえばutmpを使用して、libutempterロギングを好きなものに追加することは可能ですが、それは明らかに 思ったほど簡単ではありません

5
Stephen Kitt

wはターミナルセッションを表示しません。 wプログラムが報告するloginデータベースは、terminalデータベースではありません。 (正式には、ユーザーアカウンティングデータベースですが、SingleUnixSpecificationはこの点で不完全です。)

ターミナルデータベースの場合、NeoVIM、emacs、tmuxscreenptybandageptyrun、さらにはscriptなど、プログラムが使用するすべてのpseudoターミナルを記録します。しかし、そうではなく、そうではありません。

(BBS、FidoNet、およびUUCP端末セッションの「呼び出し」端末の使用法などを記録しないことについて、歴史について少し知識が必要な同様の議論をすることができます。)

loginデータベースとして、テキストとグラフィックの両方でloginセッションを記録します。 libvteの人々は、このデータベースへの書き込みは、端末の範囲内ではなく、グラフィカルおよびテキストのloginサブシステムの範囲内であると主張していますemulator実行中- ログインセッション。これは、トラステッドコンピューティングベースを使用しないプログラムがログインデータベースを書き込み/更新できるようにすることで、ログインアカウンティングのセキュリティが無意味になるという事実によって裏付けられた公正な点です。

そのため、すべてのターミナルエミュレータセッションがログインデータベースにログインセッションとして表示されることを期待するべきではありません。実際、anyターミナルエミュレータセッションです。ログインシェルを呼び出しているターミナルエミュレーターでさえシステムへの実際のログオンは行っていません、完全にログイン済みのセッション内で動作しています。ターミナルエミュレータの作成者は、ログインデータベースにターミナルエミュレータセッションを記録させようとしましたが、その努力により、長い間認識されてきた多くの問題が発生しました。

逆に、should[〜#〜] gui [〜#〜]ログインセッションの単一のレコードが表示されることを期待します。 (ただし、さらに読む記事で説明されているように、実際にはこれはかなり混乱しています。)

参考文献

2
JdeBP