상세 컨텐츠

본문 제목

paramiko ssh stdin.write 명령어 사용 시 OSError: socket is closed 발생

Dev Type

by ai developer 2024. 7. 2. 15:00

본문

 

python을 활용해 ssh 접속을 하고 명령어를 실행하는 것을 자동화하는 작업을 진행하고 있습니다.

이 때 사용하기 좋은 라이브러리가 sftp, ssh 모두 간단히 이용할 수 있는 paramiko입니다.

 

개발하던 중 테스트 중 sudo 명령어에 의해 막히는 일이 발생합니다.

오류에서는 stdin.write 명령에 의해 발생하는데, OSError: socket is closed 라고 나옵니다. 

내가 너무 많이 연결 테스트를 해서 발생한건가 싶어 close를 잘 하고 있는지 점검하고 close가 잘 되어 있는데도 이런가 싶어 container를 재실행해 줍니다. 하지만 그래도 계속 발생하는데요. 완전히 헛다리를 짚었죠 ㅠㅠ

알고 나면 간단한 해결책은 이것입니다.

ssh.exec_command(install_cmd, get_pty=True)
 
위와 같이 명령어를 실행할 때 get_tpy 옵션을 True로 해줍니다.
 
paramiko의 exec_command 메서드는 get_pty 옵션을 제공하는데, 이것은 pesugo-terminal(PTY)를 사용할지 여부를 결정합니다.
PTY는 터미널과 로컬 랩탑의 터미널과 유사한 환경을 원격 명령 실행에 제공하는데 사용됩니다.
그래서 대화형 프로그램이나 비밀번호 입력이 필요한 명령을 실행할 때 유용합니다. 하지만 기본값은 터미널 환경과 독립적으로 실행되는 False이기 때문에 True로 변경해 주면 이와 같이 sudo 명령이나 password를 물을 때 유용합니다.
 
알고 나면 아주 간단한데, 알기까지 고생해서 도움이 될까 싶어 공유합니다.
300x250

관련글 더보기

댓글 영역