如何保持SSH连接不中断?

4
我正在尝试运行一个可能需要1个小时或更长时间的命令,我已经尝试添加


while sleep 300; do echo "1"; done

所以它不会因为闲置而断开我的连接,这起到了作用。但是有时候它仍然会因为其他原因而断开连接,显示“连接到 *.*.*.* 被远程主机关闭”。我猜这可能是一个默认的时间限制或类似的东西,我真的不知道。有没有办法增加那个时间或者让它永远不要断开连接?如果没有,有没有办法在关闭ssh连接后仍然保持该命令运行?

这个回答解决了你的问题吗?保持SSH会话活跃 - undefined
3个回答

12

如果您无法更改服务器设置,则应通过指定频繁的保持活动信号来启动ssh,以允许您的命令完成。例如:

ssh -o ServerAliveInterval=20 myname@myhost.com

应该每隔20秒向服务器发送一个“存活”信号,以保持连接活动状态


3

对我来说,SSH连接经常会挂起。

以下解决方案适用于我。现在SSH连接总是保持在线状态。

从服务器端:


  1. 编辑位于 /etc/ssh/sshd_config 的文件。
$ sudo vi /etc/ssh/sshd_config
  1. 在文件中添加或启用此行。
ClientAliveInterval 60

保存文件并重新启动sshd服务。
$ sudo service sshd restart

来自本地计算机/客户端:


  1. 编辑位于/etc/ssh/ssh_config的文件。
$ sudo vi /etc/ssh/ssh_config
  1. 将此行添加到文件中。
ServerAliveInterval 60
  1. 保存文件

关于这些参数:

ServerAliveInterval: 客户端在发送空数据包以保持连接的时间间隔(单位:秒)。

ClientAliveInterval: 服务器在发送空数据包以保持连接的时间间隔(单位:秒)。

重要提示:每当对生产环境进行任何修改时,请确保创建备份。


1

以下代码是用于ServerAliveCountMax的,请记得不要将其保留为0

https://github.com/openssh/openssh-portable/blob/c8eb3941758615c8284a48fff47872db926da63c/packet.c#L330

static void
server_alive_check(struct ssh *ssh)
{
    int r;

    if (ssh_packet_inc_alive_timeouts(ssh) > options.server_alive_count_max) {
        logit("Timeout, server %s not responding.", host);
        cleanup_exit(255);
    }
    if ((r = sshpkt_start(ssh, SSH2_MSG_GLOBAL_REQUEST)) != 0 ||
        (r = sshpkt_put_cstring(ssh, "keepalive@openssh.com")) != 0 ||
        (r = sshpkt_put_u8(ssh, 1)) != 0 ||     /* boolean: want reply */
        (r = sshpkt_send(ssh)) != 0)
        fatal_fr(r, "send packet");
    /* Insert an empty placeholder to maintain ordering */
    client_register_global_confirm(NULL, NULL);
    schedule_server_alive_check();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接