web-dev-qa-db-ja.com

なぜbashから直接agettyを呼び出しても効果がないように見えるのですか?

ターミナルエミュレーター(Xベースとカーネルベースの両方)でbashから_/usr/bin/agetty -_を呼び出そうとすると、ユーザー名を入力するように求められましたが、そのユーザー名を入力すると、しばらくの間「フリーズ」します。 、その後、元のbashプロモートに戻しました。

疑問に思い始めたのですが、agettyはttyxデバイスとexecve(/usr/bin/login)を使用するサービスとしてsystemdによって開始されます。ログインは_pam_systemd_で構成されているため、ログインプロモートが表示されます。 systemdセッションが作成されます。しかし、これは、前述のように_agetty -_を直接実行したときに得られる結果ではありません。_systemctl status_をチェックしても、新しいセッションは作成されません。

次に、agettyが通常のユーザーとして実行されているためか、それ自体のEUIDなどをチェックする可能性があると思いましたが、ユーザー名を入力した後、bashが終了するだけです。

もう一度_systemctl status_をチェックしましたが、systemdはこのプログラムを_/sbin/agetty -o -p -- \u --noclear tty2 linux_として実行すると表示されました。わかりました。tty2にrootとしてログインしてから、_agetty -o -p -- \u --noclear - linux_を実行しました。そもそも-私は再びbashに戻されました。

これらの実験結果を理解する必要があります。

ArchLinuxを使用しています。_/usr/bin/login_と_/usr/bin/agetty_はどちらも_util-linux 2.33-2_パッケージからのものです。

どうやら「再帰的login」は何か便利なことをしていたようですが、Linuxでしばらくは動作することが期待されていません。

非再帰的なlogin、またはsuSudoなど、より一般的に使用される手法を使用することをお勧めします。これらは現在のシステムでよりよく理解され、文書化されているためです。

可能であれば、suを避けてsu -lを優先します。これにより、環境変数のクリーンなセットが得られます。

私はnotあなたが説明する特定の結果が表示される理由を知りません。しかし、「再帰的login」の動作を理解する必要がある場合は、何がうまくいかないかについて、理解する必要のある2つの特定のポイントを考えることができます。

バグ

文書化されていないBSD-rオプションはサポートされていません。これは、一部のrlogind(8)プログラムで必要になる場合があります。

古き良き時代に可能であった再帰的ログインは、もはや機能しません。ほとんどの目的で、su(1)は十分な代替品です。実際、セキュリティ上の理由から、loginはvhangup()システムコールを実行して、ttyで可能なリスニングプロセスを削除します。これは、パスワードの盗聴を回避するためです。コマンドloginを使用すると、周囲のシェルはttyの真の所有者ではなくなったため、vhangup()によって強制終了されます。

--man login

また、systemdを使用している場合は、ログインセッションを追跡しますが、ネストすることはできません。これは 意図的な選択 systemdログインセッションが「auditセッション」とどのように相互作用するかについてです。 su/Sudoは現在の「auditセッション」をエスケープしません。

現在、Sudoを実行するたびに、systemdがこのデザインについてノイズの多いログを記録しているのを見ることができます。なぜこれが望ましいと考えられるのか私に聞かないでください...

Sudo[1079]: pam_systemd(Sudo:session): Cannot create session: Already running in a session

完全な開示:man loginからの引用は続きます:

コマンドloginを使用すると、周囲のシェルはttyの真の所有者ではなくなったため、vhangup()によって強制終了されます。これは、トップレベルのシェルまたはxtermでexec loginを使用することで回避できます。

2
sourcejedi