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

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

我正在为一些备份程序设置一些后台 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 的响应程度 :)

相关内容