我想追踪 ssh 使用的系统调用来输出此警告消息:
> ssh root@abcde
The authenticity of host .. can't be established.
如果消息发送到 stderr 或 stdout,肯定会有系统调用跟踪显示 sshwrite()
到 stderr/stdout。
然而,没有。
那么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