当 shell 退出时杀死后台 SSH

phe*_*mer 6 bash ssh

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

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

有没有聪明的方法可以做到这一点?

我最好的主意是

ssh -o PermitLocalCommand=yes -o LocalCommand='cat >/dev/null; kill $PPID' $HOST &
Run Code Online (Sandbox Code Playgroud)

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

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

phe*_*mer 3

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

我想出的解决方案是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
Run Code Online (Sandbox Code Playgroud)