명령이 직접 호출되면 ssh가 중단되지만 대화 형으로 실행하면 깨끗하게 종료됩니다.
문제
원격 머신에서 서버를 시작하고 서버 프로세스가 사이트를 생성하는 포트 번호를 검색해야합니다.호출되면 서버는 임의의 포트를 수신하고 stderr에 포트 번호를 출력합니다.
원격 머신에 로그온하고, 프로세스를 시작하고, 포트 번호를 검색하는 프로세스를 자동화하고 싶습니다.작업을 호출 한 다음 포트 번호를 반환하는 래퍼 역할을하기 위해 원격 시스템에있는 "invokejob.py
"라는 Python 스크립트를 작성했습니다. 다음과 같습니다.
라코 디스
대화식으로 로그인하면 다음 스크립트가 작동합니다. 라코 디스
(참고 : 로그 아웃 성공, 중단되지 않음)
그러나 명령 줄에서 호출하려고하면 중단됩니다. 라코 디스
두 번째 경우에 중단되는 이유와이를 방지하기 위해 내가 무엇을 할 수 있는지 아는 사람이 있습니까?
프로그램의 출력을 검색해야하므로 ssh "-f"플래그를 사용하거나 표준 출력을 리디렉션 할 수 없습니다.
해결책
위 줄인 것 같습니다.ssh를 통해 직접 명령을 호출하면 전체 pty (Linux 가정)를 얻지 못하므로 읽을 수있는 stderr가 없습니다.
대화식으로 로그인하면 stdin, stdout 및 stderr가 설정되어 스크립트가 작동합니다.
다른 팁
@ 벤 콜린스
stderr이 문제라는 점에 대해 당신이 옳다고 생각합니다.나는 그것이 readline () 호출을 차단하고 있다고 확신합니다.
결국 포기하고 pexpect 의 pxssh 모듈을 사용하여 상호 작용을 자동화하기로 결정했습니다.ssh 세션
@Misha M
안타깝게도 세미콜론 트릭은 여기서 작동하지 않습니다. 내 프로그램 실행을 차단합니다.
다음을 수행하면 어떻게 되나요?
ssh <remote host> '<your command> ;<your regexp using awk or something>'
예
ssh <remote host> '<your program>; ps aux | awk \'/root/ {print $2}\''
이는 사용자 루트 또는 설명에 루트가있는 프로세스에 대한 각 PSID에 연결하고 실행 한 다음 인쇄합니다.
원격 컴퓨터에서 모든 종류의 명령을 실행하는 데이 방법을 사용했습니다.실행하려는 명령을 작은 따옴표 ( ')로 묶고 각 명령을 세미콜론 (;)으로 구분하는 것이 문제입니다.