![“ssh root@server”永远挂起](https://linux22.com/image/537648/%E2%80%9Cssh%20root%40server%E2%80%9D%E6%B0%B8%E8%BF%9C%E6%8C%82%E8%B5%B7.png)
有时我的 ssh 客户端需要很长时间才能登录。
当服务器没有响应(超载、进程被终止等)时,就会发生这种情况。我的自动化脚本将失败,因为 ssh 进程永远不会退出。
是否有一个 ssh 配置值来设置超时,以便如果 ssh 在预定义的秒数后无法登录则失败?
我知道服务器端有旋钮,但我必须在客户端进行设置,因为 sshd 进程没有响应或响应不正确。
谢谢!
答案1
我见过甚至设置 ConnectTimeout 也不起作用的情况。当使用自动 ssh 连接到大量服务器时,这种情况尤其令人讨厌。我的解决方案是在客户端使用包装器,如果 ssh 进程无法连接并足够快地返回,则终止该进程。类似这样(在 perl 中):
$SshCmd = "ssh server.example.com uname -a";
$TimeOut = 120;
eval {
local $SIG{ALRM} =
sub {
# ignore SIGHUP here so the kill only affects children.
local $SIG{HUP} = 'IGNORE';
kill 1,(-$$);
print STDERR "ssh terminated, max run time of $TimeOut seconds exceeded.\n";
};
alarm $TimeOut;
system ($SshCmd) || die "failed to run $SshCmd: $!";
alarm 0;
};
$SIG{HUP} = 'DEFAULT';
这会设置一个秒数警报$TimeOut
,如果超过警报时间,则会杀死子进程(ssh 命令)。
答案2
我遇到了同样的问题并使用 Linux“超时”来终止挂起的 scp 会话。
timeout -s 9 1h command command_arguments
如果命令执行时间超过一小时,将发送 kill -9。
仅供参考,ConnectTimeout 选项对我来说不起作用。
答案3
如果使用 ssh(来自 OpenSSH),请在 .ssh/config 中设置“ConnectTimeout”。
连接超时
指定连接到 ssh 服务器时使用的超时时间(以秒为单位),而不是使用默认的系统 TCP 超时时间。此值仅在目标关闭或确实无法访问时使用,而不是在目标拒绝连接时使用。
尝试在 sshd_config 中设置“UseDNS no”。