我正在尝试从我的 bash 配置文件脚本生成 SSH,该脚本在后台运行以实现连接共享(通过其控制套接字)。我遇到的问题是一种可靠的方法,可以确保一旦 TTY 关闭(或更直接地说,一旦父 bash shell 退出),SSH 就不会保持运行。
我知道 shell 在正常退出时可以运行命令(以终止 SSH),但我正在尝试处理 shell 没有机会关闭的所有可能情况。
有什么聪明的方法可以做到这一点吗?
我最好的主意是
ssh -o PermitLocalCommand=yes -o LocalCommand='cat >/dev/null; kill $PPID' $HOST &
但这是行不通的,因为我只需要命令在成功启动后才进入后台。或者,我不能使用-fN
shell 来代替,&
因为 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 shell 后保持程序运行。