6

我有一个 bash 脚本,它创建 ssh 隧道以安全地连接远程 mysql 服务器,如下所示。

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

进程在脚本退出时没有被杀死的原因是-f传递给 ssh 的原因将它分叉到后台。这是 SSH 隧道在不中断下一行执行的情况下工作所必需的。

于 2013-03-06T04:54:23.757 回答