私の観察:
新しい端末を開くと(ドワーフ/lx):
- 新しい/dev/pts/X使用
who
これらのどれもリストされていません。- 最初の文字
echo $0
ではないため、-
ログインシェルではありません。
ssh
同じユーザーを使って同じコンピューターに入ると- 新しい/dev/pts/X使用
who
これらをリストしてみてください- 最初の文字
echo $0
は-
なのでログインシェルです。
新しく開くと端末 (ctrl-alt-Fxx)
- 新しい/dev/ttyXX使用
who
これらをリストしてみてください- 最初の文字
echo $0
は-
なのでログインシェルです。
走れば
su -
- 同じ/dev/pts/X使用(
su -
発行された場所) who
これらのどれもリストされていません。- 最初の文字
echo $0
は-
なのでログインシェルです。
- 同じ/dev/pts/X使用(
結論として:
- 新しい pty を生成しても、utmp(?) に項目は自動的に生成されません。
質問:
who
現在ログインしているユーザーのリストを表示している場合は、各ログインシェル(?)のエントリを表示する必要があります。ただし、rootユーザーログインエントリは表示されませんsu -
。なぜですか?
編集する:この時点で私が理解できるもう一つのことは、「utmpに新しいエントリを作成する前に新しいpty / ttyとログインシェルでなければなりません」ということです。
答え1
まず、who
ログインシェルやそのようなものを気にしないでください。ただutmp
項目をダンプします。ログインしていない端末、グラフィックセッション、FTP接続(完全に設定されたtty "line"名を含む)のエントリがある可能性があります。
2. utmpエントリの作成手動- ログインを処理するプログラムが呼び出されたときにのみエントリを取得できますpututline(…)
。たとえば、sshdは常にこれを行い、端末エミュレータはよくこうしてください(常にそうではありません)。su
決してこれをしないでください。
(su
新しいptyを割り当てないため、utmpエントリも追加できないことを覚えておいてください。そうしないと、同じttyに対して複数のエントリが生成され、いくつかのプログラムが混乱する可能性があります。)