2013-03-05 12 views
5

Ho uno script bash che crea il tunnel ssh per connettere il server mysql remoto in modo sicuro come mostrato di seguito.come terminare il processo figlio del tunnel ssh all'uscita dello script bash

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 

Dopo aver aperto il tunnel ssh nello script bash, in caso di uscita dello script bash, ho notato che il processo figlio tunnel SSH è ancora vivo.

Dopo lo script, se si esegue netstat, viene visualizzato di seguito.

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 

Come si termina elegantemente il processo figlio ssh (6402) per pulire lo script? Ho pensato di usare 'killall ssh' ma potrebbe uccidere altri processi ssh creati da altri per sbaglio.

Grazie.

risposta

7

Ho trovato un modo per farlo utilizzando i socket di controllo in SSH. In sostanza:

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 

Il motivo per cui il processo non viene ucciso all'uscita sceneggiatura è che -f passata a ssh forcelle allo sfondo. Ciò è necessario affinché i tunnel SSH funzionino senza interrompere l'esecuzione della riga successiva.

+0

Grazie mille. Funziona. Non lo sapevo, con l'opzione -f, ssh diventa il processo in background e continua a essere eseguito all'uscita dallo script. È difficile trovare questa soluzione semplicemente leggendo la pagina man di ssh. Questo è molto meglio e più elegante di 'killall ssh'. – user1026669

+0

Se l'opzione -f di ssh rende lo ssh in modalità background, sono curioso di sapere come mai "echo $!" ancora non mostra niente subito dopo lo ssh. – user1026669

+1

Bene, è * forking * in un processo in background, il che significa che bash deve sapere esplicitamente per ottenere l'ID del processo. Se non hai usato '-f' e invece hai' ssh -N -L $ LOCAL_PORT: localhost: 3306 $ REMOTE_USER @ $ REMOTE_IP & 'allora' $! 'Restituirebbe un PID dato che hai a che fare con il lavoro bash controllo a quel punto. – cwgem