![即使 SSH 隧道仍在使用,也要在 X 分钟后终止它?](https://linux22.com/image/489037/%E5%8D%B3%E4%BD%BF%20SSH%20%E9%9A%A7%E9%81%93%E4%BB%8D%E5%9C%A8%E4%BD%BF%E7%94%A8%EF%BC%8C%E4%B9%9F%E8%A6%81%E5%9C%A8%20X%20%E5%88%86%E9%92%9F%E5%90%8E%E7%BB%88%E6%AD%A2%E5%AE%83%EF%BC%9F.png)
我正在为一些备份程序设置一些后台 SSH 隧道。但是我担心 ssh 进程只是闲置着。在脚本结束时,我杀死了 PID,但如果我的脚本发生某些事情并且它没有完成怎么办。我想要一些更强大的东西。
有没有什么办法可以让 SSH 隧道在 X 秒/分钟后自行终止?
目前我是这样开始的
ssh -f -N -L 14880:internalserver:3306 gateway.example.com
然后使用 lsof 获取打开该端口的 PID。
答案1
这是之前提出过的一种更简洁的方法:
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 收到错误代码,但可以安排。
答案2
expect 包中有 timeout 命令作为示例之一。你可以用对该命令的调用来包装整个脚本。
或者类似这样:
ssh -f -N -L 14880:internalserver:3306 gateway.example.com &
PID=$!
nohup "sleep 600; kill $PID" &
答案3
看这个:
ssh -f -L 14880:internalserver:3306 gateway.example.com sleep 3m
这将设置一个隧道,并允许您在 3 分钟内连接。如果您连接,它将一直可用,直到空闲为止。但是,这不会终止正在运行的备份进程(我希望这是您想要的)。
答案4
另一种方法是设置会话中的空闲超时值。这可以在服务器上的 sshd_config 中使用“IdleTimeout”值完成,也可以由用户在 authorized_keys 文件中以“idle-timeout=6m ...key...”完成。或几小时。或几秒。oreilly 的“SSSH 安全外壳”一书中的第 8.2.7 节。在一定量的不活动(无输入)之后,您的进程将被终止。清理程度取决于它们对 hups 的响应程度 :)