2013-03-05 5 views
5

다음과 같이 원격 mysql 서버를 안전하게 연결하는 ssh 터널을 만드는 bash 스크립트가 있습니다. bash 스크립트 종료시 ssh 터널 자식 프로세스를 종료하는 방법

ssh -f -N -L $LOCAL_PORT:localhost:3306 [email protected]$REMOTE_IP 
mysql -P $LOCAL_PORT -h 127.0.0.1 -u lapl_stg -p${REMOTE_DB_PASS} <./t1.sql> ./out.txt 

은 bash는 스크립트의 종료에 따라, bash는 스크립트에서 SSH 터널을 연 후, 나는 SSH 터널 자식 프로세스가 아직 살아 것으로 나타났습니다.

netstat을 실행하면 스크립트가 종료 된 후 아래에 표시됩니다.

netstat -a -n -p -l 
(Not all processes could be identified, non-owned process info 
will not be shown, you would have to be root to see it all.) 
Active Internet connections (servers and established) 

Proto Recv-Q Send-Q Local Address   Foreign Address   State  PID/Program name 

tcp  0  0 127.0.0.1:3308   0.0.0.0:*    LISTEN  6402/ssh   
tcp  0  0 10.44.44.11:46836  10.44.44.21:22   ESTABLISHED 6402/ssh   
tcp6  0  0 ::1:3308    :::*     LISTEN  6402/ssh 

어떻게하면 스크립트에서 정리하기 위해 ssh 하위 프로세스 (6402)를 우아하게 종료합니까? 나는 'killall ssh'를 사용하는 것에 대해 생각했지만 사고로 다른 사람들이 만든 다른 ssh 프로세스를 죽일 수있었습니다.

감사합니다.

답변

7

SSH에서 제어 소켓을 사용하여이를 수행하는 방법을 발견했습니다. 기본적으로 :

ssh -M -f -N -L $LOCAL_PORT:localhost:3306 [email protected]$REMOTE_IP -S /tmp/ssh-control 
mysql -P $LOCAL_PORT -h 127.0.0.1 -u lapl_stg -p${REMOTE_DB_PASS} <./t1.sql> ./out.txt 
ssh -S /tmp/ssh-control -O exit $REMOTE_IP 

프로세스가 스크립트 출구에서 살해되지 않는 이유는 -f이 배경에 포크에게 그것을 ssh를 전달한다는 것입니다. SSH 터널이 다음 라인의 실행을 방해하지 않고 작동하는 데 필요합니다.

+0

대단히 감사합니다. 그것은 작동합니다. 나는 -f 옵션을 사용하여 ssh가 백그라운드 프로세스가되고 스크립트 종료시 계속 실행된다는 것을 알지 못했습니다. ssh man 페이지를 읽는 것만으로는이 해결책을 찾기가 어렵습니다. 이것은 'killall ssh'보다 훨씬 뛰어나고 우아합니다. – user1026669

+0

ssh의 -f 옵션으로 ssh가 백그라운드 모드가되는 경우 궁금합니다. 'echo $!' ssh 바로 뒤에는 아무 것도 표시되지 않습니다. – user1026669

+1

글쎄, 그것은 * 백그라운드 프로세스로 포크 화하는 것이다. 즉, bash는 프로세스 ID를 얻기 위해 명시 적으로 알아야한다. 만약 당신이'-f'를 사용하지 않고 대신'ssh -N -L $ LOCAL_PORT : localhost : 3306 $ REMOTE_USER @ $ REMOTE_IP &'를 가지고 있다면 bash 작업을 다루고 있기 때문에'$!'는 PID를 돌려 줄 것입니다 그 시점에서 통제. – cwgem