Мы запускаем простой сценарий развертывания удаленно с помощью такой команды, как ssh deployer@10.170.4.11 sudo /root/run-chef-client.sh
. Он начал зависать сегодня, потому что sshd
ждал вечно на 10.170.4.11
даже после sudo
уже закончил. Мы начали sshd
в режиме отладки и получил два разных журнала. Ниже приводится нормальный журнал, когда сеанс не зависает:
debug1: Received SIGCHLD.
debug1: session_by_pid: pid 23187
debug1: session_exit_message: session 0 channel 0 pid 23187
debug1: session_exit_message: release channel 0
Received disconnect from 10.170.4.6: 11: disconnected by user
А при зависании получаем следующее:
debug1: Received SIGCHLD.
debug1: session_by_pid: pid 24209
debug1: session_exit_message: session 0 channel 0 pid 24209
debug1: session_exit_message: release channel 0
Мы понимаем, что серверный процесс ожидает какого-либо сообщения со стороны клиента и никогда его не получает. Трудно сказать, проблема это на стороне клиента или на стороне сервера. Мы пытались бежать sshd
под strace
но не удалось, потому что бит SUID sudo
было проигнорировано в этом случае. Итак, что еще мы должны попытаться отладить / предотвратить такие ситуации?
С помощью ssh -t
(принудительное выделение PTY) на стороне клиента решило проблему:
debug1: Received SIGCHLD.
debug1: session_by_pid: pid 31701
debug1: session_exit_message: session 0 channel 0 pid 31701
debug1: session_exit_message: release channel 0
debug1: session_pty_cleanup: session 0 release /dev/pts/1
Received disconnect from 127.0.0.1: 11: disconnected by user
debug1: do_cleanup
debug1: PAM: cleanup
debug1: PAM: closing session
debug1: PAM: deleting credentials
sshd
контролируется псевдо-телетайпом, а не клиентом.