로컬 명령 실행 중에만 터널 열기

로컬 명령 실행 중에만 터널 열기

원격 서버에 대한 터널이 필요한 스크립트가 있습니다. 이 같은:

ssh -fNL 8080:localhost:80 my_server

이후 터널을 어떻게 닫을 수 있나요?로컬 스크립트마치다?

위의 예는 제가 시도한 조합 중 하나일 뿐입니다. SSH 호출을 차단하고, 원격 명령을 실행하고, "sleep"을 사용하여 터널을 자동으로 닫는 방법을 살펴봤지만 스크립트가 실행되는 동안에만 터널을 제공하는 방법을 원합니다.

나의 마지막 접근 방식은 ssh를 백그라운드로 포크하여 스크립트가 종료될 때 종료되도록 하는 것이었지만, 위 명령을 사용하면 스크립트를 종료한 후에도 ssh 프로세스가 여전히 존재합니다. 또한 배경 SSH를 수동으로 종료하기 위해 PID를 얻는 방법도 연구 중입니다.

답변1

그냥 사용

function atexit() {
  kill $TUNNEL_PID
}
trap atexit EXIT
ssh -nNL 8080:localhost:80 my_server &
TUNNEL_PID=$!

(즉, ssh 자체를 백그라운드로 알리지 말고 일반 백그라운드 작업으로 실행하고 pid를 저장하세요.)

답변2

&마지막에 추가하여 ssh 명령을 백그라운드로 설정할 수 있어야 합니다 . 그런 다음 다음 줄에 추가하십시오.

SSHPID=$!

$! 가장 최근 백그라운드 명령의 PID이므로 SSH 세션의 PID입니다. 그런 다음 스크립트 끝에서 kill -SIGKILL $SSHPID.

답변3

방금 솔루션을 테스트했는데 그 방식이 마음에 들지 않지만 작동합니다.

전제 조건:

  • 화면 명령이 설치됨
  • 잠금 해제된 SSH 키를 사용하여 SSH 연결

솔루션 구축 방법에 대한 지침:

터널을 시작해야 하는 위치에 다음 줄을 추가합니다.

screen -d -m -S myTunnel ssh 0.0.0.0:123:118.218.118.218:5555 myServer # starts a screen in detached mode and create your tunnel

작업을 실행하고 스크립트 끝에 추가합니다.

kill `ps -A -o -pid,cmd|grep "SCREEN -d -m -S myTunnel"| grep -v grep| head -n 1| awk '{print $1}'` # kills the opened screen
screen -wipe  # clears screens list (not allways usefull, depends on the commands ran by the screen)

이제 터널은 폐쇄되었습니다.

이 솔루션은 작동하지만(방금 테스트했음) 최첨단 답변은 아닙니다.

감사해요Cheppner의 답변 필요할 때 항상 사용합니다.

편집: 더 나은 답변이 있을 것이라고 확신합니다.

관련 정보