“ssh root@server”永远挂起

“ssh root@server”永远挂起

有时我的 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”。

相关内容