점프 호스트 뒤의 서버에 대해 ssh 명령을 사용하여 스크립트를 실행하고 있습니다. 보안 네트워크의 서버에서 명령을 실행하고 싶을 때마다 점프 호스트(배스천) 서버에 ssh로 접속하여 실행한 nc
다음 netcat 채널을 통해 실행하려는 실제 명령으로 ssh를 실행해야 합니다. 그러면 원본을 중지해야 합니다 nc
.
나는 동시에 두 개의 프로세스를 실행하고 nc
피기백 프로세스가 완료되면 SSH 프로세스를 닫을 수 있게 해주는 "스마트 앰퍼샌드"를 원합니다.
이것이 제가 현재 하고 있는 일입니다.
ssh -g -L 23:localhost:22 -f -N user@jumphost &
ssh user2@localhost -P 23 "ssh user@destination server \"ls -al\""
kill -0 $!
문제는 그것이 원자적이지 않다는 것입니다. 스크립트에 오류가 있으면 완료되지 않고 nc
원래 프로세스가 종료되지 않습니다.
내 질문은 다음과 같습니다두 프로세스를 시작하는 방법은 무엇입니까? 그러면 첫 번째가 완료되면 두 번째도 완료되나요?
답변1
귀하의 질문에 대한 답변은 아니지만 이 답변은수귀하의 문제를 해결하기 위해 다음을 수행하고 싶습니다.
ProxyCommand
앱에서 사용하면 ~/.ssh/config
다음과 같은 모든 작업이 수행됩니다.
Host server
HostName server.tld
User {server user}
Host proxy
ProxyCommand ssh server -W %h:%p
User {proxy user}
그런 다음 다음 명령을 사용하여 간단히 서버에 액세스할 수 있습니다.ssh server
답변2
내가 당신의 명령을 올바르게 해석하면 이와 같지 않을까요?
ssh -t user@jumphost ssh user@destination ...
당신 -L
이 하고 있는 일은 포트를 점프 호스트의 SSH 서버로 전달하는 것뿐입니다. 하지만 이미 해당 서버에 연결되어 있는데 추가 터널이 필요한 이유는 무엇입니까?
이 경우 jumphost는 연결할 두 번째 SSH 클라이언트이기도 합니다. 점프 호스트를 클라이언트로 신뢰할 수 없다면(즉, 점프 호스트가 암호화된 데이터만 보도록 하려는 경우) 신뢰하지 말아야 합니다. 그렇지 -L 23:destination:22
않습니까 localhost
?
답변3
해결 방법 사용 wait
:
wait
PID를 사용하여 다음을 기다릴 수 있지만 단순히 wait $PID
매개변수를 사용하여 두 번째 명령을 실행하겠습니다. 모든 출력은 명령에 인수로 전달되지 않으므로 무시해야 합니다. 따라서 wait
인수 없이 wait
as를 사용할 수 있습니다 command & wait
.
process1 & wait $( process2 &> /dev/null )
논리적으로 변수가 해석되기 전에 process1
완료될 때까지 기다려야 합니다 .process2
wait
process2
편집: 이는 중첩될 수도 있습니다.
sleep 1 & wait $( sleep 2 & wait $( sleep 3 & wait $( sleep 4 ) ) )
4초 동안 지속 됩니다 sleep
.