我有一个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进程。
谢谢。
答案 0 :(得分:7)
我找到了一种在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隧道在不中断下一行执行的情况下工作。