suコマンドは、パスワードが画面に表示されるのをどのようにブロック/保護しますか? [コピー]

suコマンドは、パスワードが画面に表示されるのをどのようにブロック/保護しますか? [コピー]

これが抽象的な質問であれば謝罪します。できるだけ具体的にお答えします。

bashシェルから別のアカウントに切り替えると、su - fooパスワードを入力するように求められます。このパスワードプロンプトに入力した文字は画面に表示されず、入力中の文字数や内容は表示されません。 bash(または通常Linux)はこれをどのように実行しますか?

答え1

入力した内容は、端末が「反響」しているため端末に表示されます。パスワードを要求するとエコーがオフになります。help read対応するオプションも参照してください-s

答え2

私はsuそれがオンになっていて、/dev/tty端末ドライバの設定をエコーなしに変更してから/dev/tty

この信念をテストするために、strace -o su.out su -Arch Linuxノートブックで実行しました。出力の関連部分strace

ioctl(0, SNDCTL_TMR_CONTINUE or TCSETSF, {B38400 opost isig icanon -echo ...}) = 0
write(2, "Password: ", 10)              = 10
read(0, "hahanotthis\n", 511)                = 7
ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig icanon echo ...}) = 0

私が100%間違っているわけではありません。su実際にはstdinから読み込みますが、ターミナルコントロールを使用してstdinからエコーをオフにしますioctl()。パスワードを入力したら、suシステムコールでエコーを再びオンにします。ioctl()

他のプログラム、ftp特にクライアントは読み取りパスワードを使用していることを知っています/dev/tty。つまり、コマンドラインにパスワードを入力できないか、「ここのドキュメント」にいくつかのトリックを使用する必要があるということです。

関連情報