如何在bash脚本退出时终止ssh隧道子进程
问题描述:
我有一个bash脚本,可以创建ssh隧道来安全地连接远程mysql服务器,如下所示。如何在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脚本打开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进程。
谢谢。
答
我发现了一种在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隧道在不中断下一行执行的情况下工作所必需的。
非常感谢。有用。我不知道用-f选项,ssh成为后台进程,并继续在脚本退出时运行。通过阅读ssh手册页很难找到这个解决方案。这比'killall ssh'更好,更优雅。 – user1026669 2013-03-06 18:22:21
如果ssh的-f选项使得ssh进入后台模式,我很好奇'echo $!'在ssh之后仍然没有显示任何东西。 – user1026669 2013-03-06 18:28:54
好吧,它*分支到后台进程,这意味着bash必须明确知道获得进程ID。如果你没有使用'-f',而是使用'ssh -N -L $ LOCAL_PORT:localhost:3306 $ REMOTE_USER @ $ REMOTE_IP&',那么'$!'会返回一个PID,因为你正在处理bash作业在那个点控制。 – cwgem 2013-03-06 19:02:12