我有一台具有间歇性连接的设备,可以“呼唤”打开反向隧道,从而允许我通过SSH进入该隧道。这可以通过systemd可靠地启动,并在任何出口自动重启:
ssh -R 1234:localhost:22 -N tunnel-user@reliable.host
现在,我想在连接时在reliable-host
上运行脚本。只需将ssh ...
cli进行简单的更改就可以轻松完成:将-N
交换为远程reliable-host
上的脚本名称:
ssh -R 1234:localhost:22 tunnel-user@reliable.host ./on-connect.sh
问题在于,一旦脚本退出,如果不使用隧道,它将关闭隧道。
我发现一种解决方法是在脚本的末尾加一个长sleep
。但是,由于sleep
不响应sleep
,因此连接断开后,SIGHUP
进程仍然存在。我可以在一个无限循环中睡得更短(我想),但这感觉很hack。
~/on-connect.sh
#!/bin/bash
# Do stuff...
sleep infinity
如何使ssh
的行为像已被使用过的-N
一样,使其保持连接状态而没有任何活动,但还可以在初始连接时运行脚本?理想情况下,不需要在远程脚本中使用特殊的sleep
(或等效项),但是,如果不可能的话,当连接断开时,可以对reliable-host
进行适当的清理。