我正在为某些备份过程设置一些后台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 🙂