これが抽象的な質問であれば謝罪します。できるだけ具体的にお答えします。
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
。つまり、コマンドラインにパスワードを入力できないか、「ここのドキュメント」にいくつかのトリックを使用する必要があるということです。