shell 退出时终止后台 SSH

shell 退出时终止后台 SSH

我正在尝试从我的 bash 配置文件脚本生成 SSH,该脚本在后台运行以实现连接共享(通过其控制套接字)。我遇到的问题是一种可靠的方法,可以确保一旦 TTY 关闭(或更直接地说,一旦父 bash shell 退出),SSH 就不会保持运行。

我知道 shell 在正常退出时可以运行命令(以终止 SSH),但我正在尝试处理 shell 没有机会关闭的所有可能情况。

有什么聪明的方法可以做到这一点吗?

我最好的主意是

ssh -o PermitLocalCommand=yes -o LocalCommand='cat >/dev/null; kill $PPID' $HOST &

但这是行不通的,因为我只需要命令在成功启动后才进入后台。或者,我不能使用-fNshell 来代替,&因为 SSH-f仅在LocalCommand完成后作为背景。

另外,我试图避免在远程主机上运行任何命令。否则我可能会做类似的事情ssh -fN $HOST 'cat >/dev/null'

答案1

如果您的 shell 是登录 shell,您可以从 ~/.bash_logout 文件停止 SSH 主连接:

ssh -O exit hostname

如果 shell 不是登录 shell,您可以在生成 SSH 后立即在 ~/.bashrc 文件中设置陷阱:

ssh -fN hostname
trap 'ssh -O exit hostname' EXIT

答案2

当我回答自己的问题时,我讨厌它。

我想出的解决方案是ControlPersist=3600在启动 master ssh 进程时使用。这样,如果 shell 没有正常退出并杀死 ssh,那么它会在一小时不活动后自行关闭。尽管我仍然在退出时使用陷阱来彻底关闭 ssh。

ssh -o ControlMaster=yes -o ControlPersist=3600 -o ControlPath=/tmp/ssh-%u-%h-%p-%r -Nf $HOST
trap "ssh -o ControlPath=/tmp/ssh-%u-%h-%p-%r $HOST -O exit" exit

答案3

断开连接后保持 SSH 会话运行

我不知道这是否是您正在寻找的,但它帮助我在退出 ssh shell 后保持程序运行。

相关内容