この警告メッセージを出力するためにsshによって使用されるシステムコールを追跡したいと思います。
> ssh root@abcde
The authenticity of host .. can't be established.
メッセージがstderrまたはstdoutに送信されると、明らかにwrite()
stderr / stdoutのsshを示すシステムコールトレースがあります。
しかしそうではありません。
もしそうなら、SSHはどのように端末に警告メッセージを表示しますか? SSHは、stderr / stdoutと対話せずにメッセージを表示するために端末デバイスで直接機能しますか?
答え1
ssh
制御端末を開くと、すぐに対応する/dev/tty
メッセージが作成されます。
sshがユーザーと対話し、パスワードを読み取るために使用するfd sshと同じです。これにより、ユーザーはsshのstderrまたはstdinを透過的にリダイレクトできます。
$ strace -f -o /tmp/strace ssh -o UserKnownHostsFile=/dev/null localhost
The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is SHA256:XXXXXXXXXXXXX8XXXXXX8XXXX4XXXXXXXXXXXX3XXXX.
Are you sure you want to continue connecting (yes/no)? ^C
$ egrep 'open|write' /tmp/strace
...
3609 openat(AT_FDCWD, "/dev/tty", O_RDWR) = 4
3609 write(4, "The authenticity of host 'localh"..., 197) = 197