이 경고 메시지를 출력하기 위해 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