X分钟后终止SSH隧道,即使它仍在使用?

我正在为某些备份过程设置一些后台SSH隧道。 但是我担心ssh进程只是坐在一旁。 在我的脚本结尾,我杀了PID,但是如果我的脚本发生了什么,它不能完成。 我想要一些更健壮的东西。

有没有办法让SSH隧道在X秒/分钟后自杀?

目前我是这样开始的

ssh -f -N -L 14880:internalserver:3306 gateway.example.com 

然后使用lsof来获取打开该端口的PID。

这是以前提出的一种更干净的方法:

 ssh -f -N -L 14880:internalserver:3306 gateway.example.com & PIDSSH=$! ( sleep 600 ; echo "Timeout." ; kill $PIDSSH ) & PIDSLEEP=$! wait $PIDSSH kill $PIDSLEEP && echo "Session ended before timeout" wait 

但是,你不会从ssh得到错误代码,但可以安排。

expect软件包有超时命令作为其中一个例子。 你可以用你的整个脚本来打包。

或者类似的东西:

ssh -f -N -L 14880:internalserver:3306 gateway.example.com &
PID=$!
nohup "sleep 600; kill $PID" &

看这个:

 ssh -f -L 14880:internalserver:3306 gateway.example.com sleep 3m 

这将build立一个隧道,并让你连接3分钟。 如果你连接它,它将变为空闲状态。 这不会杀死正在运行的备份过程(我希望这是你想要的)。

另一种方法是在会话中设置空闲超时值。 这可以通过sshd_config中的“IdleTimeout”值或者authorized_keys文件中的用户作为“idle-timeout = 6m … key …”在服务器上完成。 或者几小时。 或者秒。 在oreilly的“SSSH The Secure Shell”一书中的第8.2.7节。 在所述不活动量(没有input)之后,你的过程将被杀死。 这是多么干净,取决于他们如何反应hups 🙂