关于bash:当我中断ssh本身时如何使ssh杀死远程进程?

How to make ssh to kill remote process when I interrupt ssh itself?

在bash脚本中,我通过ssh在远程机器上执行一个命令。如果用户通过按ctrl+c中断脚本,那么它只会停止脚本,甚至不会停止ssh客户机。而且,即使我杀死ssh客户机,远程命令仍在运行…

如何让bash在crtl+c上终止本地ssh客户机和远程命令调用?

一个简单的脚本:

1
2
#/bin/bash
ssh -n -x root@db-host 'mysqldump db' -r file.sql

最终我找到了这样的解决方案:

1
2
#/bin/bash
ssh -t -x root@db-host 'mysqldump db' -r file.sql

所以-我用"-t"代替"-n"。删除"-n"或使用与根用户不同的用户没有帮助。


当ssh会话结束时,shell将得到一个叹息。(挂断信号)。您需要确保它将它发送到从它开始的所有进程。对于bash,尝试shopt -s huponexit; your_command。这可能不起作用,因为手册页上说huponexit只适用于交互式shell。

我记得当用户在我的集群上运行作业时遇到这种情况,他们是否必须使用nohup(以获得与您想要的相反的行为),但是我在bash手册页中找不到关于子进程是否默认忽略叹息的任何内容。希望Huponexit能成功。(我想你可以把那家商店放在.bashrc中,而不是命令行中。)

不过,您的ssh -t应该可以工作,因为当连接关闭时,从终端读取将得到EOF或错误,这会使大多数程序退出。


你知道你要传递给ssh的选项是什么吗?我想不会。-n选项重定向来自/dev/null的输入,因此您在远程主机上运行的进程可能没有看到来自ctrl-c的sigint。

现在,让我们谈谈允许远程根登录的想法有多糟糕:

这是个非常非常糟糕的主意。请看一下如何:设置ssh密钥以获取一些关于如何通过ssh安全地管理远程进程执行的建议。如果您需要远程运行具有特权的东西,您可能需要一个解决方案,该解决方案涉及一个带有嵌入式命令的ssh公钥和一个作为sudo根代码运行的脚本。


1
trap"some_command" SIGINT

当按下ctrl+c时,将在本地执行some_commandhelp trap会告诉你它的其他选择。

关于ssh的问题,我对ssh不太了解。也许你可以让它调用ssh -n -x root@db-host 'killall mysqldump'而不是some_command来杀死远程命令?