当连接到行为不端的 SSH 服务器时,是否有一个标志或配置设置可以用来告诉客户端如果在短时间内没有到达交互式控制台则提前放弃?
我知道-o ConnectTimeout
当主机无法访问时,哪个会中止连接。在这种情况下,主机可以访问,初始连接很快发生(“服务器接受密钥”在不到 1 秒的时间内),但随后 PAM 的某个层发生故障,意味着我可能会在 3 秒、12 秒或永远无法获得实际的命令提示符。连接会停滞,直到我发送 Ctrl+C 或等待 90 秒,直到出现“与 [主机] 端口 22 的连接超时”
在解决根本原因之前(我并不想通过这个问题来解决这个问题),我能做些什么来缓解症状?如果我们在 5 秒内没有得到有用的提示,我想自动断开连接。
答案1
如果底层连接稳定,并且我们的主要目标是打开多个会话而不玩 PAM 轮盘赌,则“主”模式可能会有所帮助:
ssh -M -S /tmp/reusable.sock user@host
一旦您第一次赢得 Ctrl+C/90 秒超时战斗,其他终端就可以快速打开:
ssh -S /tmp/reusable.sock user@host
只要原始连接保持打开状态,这种方法就有效。连接时间的减少假设问题出在身份验证步骤中(因为像这样多路复用套接字可以绕过重新身份验证)
答案2
如果在设置端口转发之前连接停止,我们可以利用套接字作为信号量并破解我们自己的看门狗:
lfg.sh:
#!/bin/bash
set -m
function watchdog {
sleep $1
if [[ ! -S "/tmp/lfg.$2" ]]; then
kill -STOP $3
fi
}
ssh -L /tmp/lfg.$$:localhost:1234 $1 && rm -f /tmp/lfg.$$ &
watchdog $2 $$ $! &
fg %-
用法:
lfg grumpy-host 5
lfg
首先启用作业控制,然后启动ssh
请求本地套接字/tmp/lfg.nnn
转发到任意远程端口。将此作业放在后台,我们要求看门狗函数等待 5 秒钟,然后查找套接字。如果不存在,则终止停滞的 ssh 进程。fg %-
将 ssh 重新放在前台,这样只要它处于交互状态,我们就可以进入;如果花费的时间超过 5 秒钟,我们将返回到本地提示符。