(제어 소켓을 통해) 연결 공유를 위해 백그라운드에서 실행되는 bash 프로필 스크립트에서 SSH를 생성하려고 합니다. 내가 겪고 있는 문제는 TTY가 닫힌 후(또는 더 직접적으로 상위 bash 쉘이 종료된 후) SSH가 계속 실행되지 않도록 하는 안정적인 방법입니다.
나는 쉘이 정상적으로 종료될 때(SSH를 종료하기 위해) 명령을 실행할 수 있다는 것을 알고 있지만 쉘이 닫힐 기회가 없는 가능한 모든 시나리오를 처리하려고 노력하고 있습니다.
이를 수행하는 현명한 방법이 있습니까?
내 최고의 아이디어는
ssh -o PermitLocalCommand=yes -o LocalCommand='cat >/dev/null; kill $PPID' $HOST &
그러나 성공적인 실행 후에 백그라운드로 이동하는 명령만 필요하기 때문에 이것은 작동하지 않습니다. 또는 SSH가 완료된 후에는 백그라운드에서만 작동하기 때문에 쉘 -fN
을 대신 사용할 수 없습니다 .&
-f
LocalCommand
또한 원격 호스트에서 어떤 명령도 실행하지 않으려고 노력하고 있습니다. 그렇지 않으면 나는 다음과 같은 일을 할 수도 있습니다ssh -fN $HOST 'cat >/dev/null'
답변1
쉘이 로그인 쉘인 경우 ~/.bash_logout 파일에서 기본 SSH 연결을 중지할 수 있습니다.
ssh -O exit hostname
쉘이 로그인 쉘이 아닌 경우 SSH를 생성한 후 즉시 ~/.bashrc 파일에 트랩을 설정할 수 있습니다.
ssh -fN hostname
trap 'ssh -O exit hostname' EXIT
답변2
내 자신의 질문에 대답하면 나는 그것을 싫어합니다.
내가 생각해낸 해결책은 ControlPersist=3600
마스터 SSH 프로세스를 시작할 때 사용하는 것입니다. 이렇게 하면 쉘이 정상적으로 종료되지 않고 ssh를 종료하지 않으면 한 시간 동안 활동이 없으면 자동으로 닫힙니다. 종료 시 SSH를 완전히 종료하기 위해 여전히 트랩을 사용하고 있지만.
ssh -o ControlMaster=yes -o ControlPersist=3600 -o ControlPath=/tmp/ssh-%u-%h-%p-%r -Nf $HOST
trap "ssh -o ControlPath=/tmp/ssh-%u-%h-%p-%r $HOST -O exit" exit
답변3
이것이 당신이 찾고 있는 것인지는 모르겠지만 SSH 셸을 종료한 후에도 프로그램을 계속 실행하는 데 도움이 됩니다.