6

以下に示すように、リモートmysqlサーバーに安全に接続するためのsshトンネルを作成するbashスクリプトがあります。

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

bashスクリプトでsshトンネルを開いた後、bashスクリプトを終了すると、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プロセスを強制終了する可能性があります。

ありがとうございました。

4

1 に答える 1

9

SSHの制御ソケットを使用してこれを行う方法を見つけました。基本的に:

ssh  -M -f -N -L  $LOCAL_PORT:localhost:3306 $REMOTE_USER@$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

スクリプトの終了時にプロセスが強制終了されない理由は、-fsshに渡されたプロセスがバックグラウンドにフォークされるためです。これは、SSHトンネルが次の行の実行を中断せずに機能するために必要です。

于 2013-03-06T04:54:23.757 に答える