Shell drop이 되지 않을 때 원격서버 재시동

원격 서버의 시스템 노드가 망가졌거나 과도한 task 실행으로 ssh로 접근할 때 제대로 shell을 drop하지 못하는 경우가 종종 생긴다.

ssh는 원격 서버에서 실행할 명령어를 인자로 받을 수 있지만 ls같은 단순한 명령어와는 달리 reboot 명령어를 수행하려면 sudo 권한을 접근하기 위한 비밀번호 입력을 필요로 한다.

비록 ssh가 “Secure SHell”이라고는 해도 일반적인 shell처럼 상호작용을 위한 비밀번호 입력 창을 대기해 주지는 않는다.

오류 메세지를 보면 다행히도 sudo는 표준입력으로 부터 비밀번호를 읽어 들이는 -S 옵션을 지원한다. 따라서 비밀번호를 표준출력으로 내보내는 명령어를 묶어서 함께 전송하면 관리자 권한으로 명령어를 실행할 수 있다.

# 비밀번호를 echo를 이용해서 표준출력으로 내보내고 sudo 명령어를 실행시킨다.
ssh <ssh_server> "echo <비밀번호> | sudo -S reboot"

다만, 이렇게 하면 history에 관리자 비밀번호가 노출되므로 동작한 후에는 history를 삭제해 주자.