保持SSH会话活动

436

我使用ssh -p8520 username@remote_host来登录远程服务器。

问题:

当我在工作场所时,总是可以连接并正常工作。不幸的是,当我从家里连接到远程服务器时,终端会在10-15分钟后冻结。

控制台上没有错误/超时报告,但光标不能再移动。

当输入w以检查登录用户时,有一些僵尸登录用户存在,我必须手动杀死它们。

这非常令人烦恼。有谁能帮帮我吗?


1
我也遇到过这个问题,我开始使用screen。也许这是某种超时问题。 - martin
1
@martin screen有助于保持程序运行。不幸的是,有时我不得不在远程服务器上工作:( - Haifeng Zhang
如果您没有参数启动它,这将为您提供一个 shell。 - martin
你是说只用 screen 就可以解决连接丢失的问题吗?不需要 screen -S screenName 吗?我一直都是使用带有 -S-r 的 screen。 - Haifeng Zhang
1
不,这并不能解决问题,你只是避免了在终端中丢失工作。如果你什么都不做,它仍然会冻结,你只能从你开始的地方重新开始。我的意思是,你可以创建一个终端,通过使用“screen”命令,你可以随时恢复。你似乎已经知道了 ;) - martin
显示剩余2条评论
5个回答

756

SSH守护进程(sshd)在服务器端运行,如果客户端没有发送信息,则会从服务器端关闭连接。为了防止连接丢失,需要指示SSH客户端定期向服务器发送生命信号。

此配置位于文件$HOME/.ssh/config中,如果文件不存在,请创建该文件(配置文件不能被全球公开读取,因此请在创建文件后运行chmod 600 ~/.ssh/config)。要将信号每隔四分钟(240秒)发送到远程主机,请将以下内容放入该配置文件中:

Host remotehost
    HostName remotehost.com
    ServerAliveInterval 240

为了对所有主机启用发送心跳信号,请将以下内容放置在配置文件中:

Host *
    ServerAliveInterval 240

2
请注意,这个配置文件位于您的个人电脑或Linux系统上。 - zzapper
38
我经常对配置名称感到困惑:客户端使用ServerAliveInterval,而服务器使用ClientAliveInterval。真是一团糟。 - youkaichao
3
作为API设计者,有时会出现这种混淆。我可能会以两种方式之一来编写API,但最重要的是对所选择标准的良好文档说明。 - Cameron Tacklind
2
c:/users/youruser/.ssh/config 用于 Windows - Michael Zelensky
5
如果你去卡尔的家里,看到冰箱上有一张纸条上写着“迈克的地址:<地址>”,这就好像在卡尔的房子里写了迈克的名字并不会引起混淆;卡尔是唯一一个不需要出现在自己家中的名字。 - Luke Griffiths
显示剩余4条评论

303

我希望有一个一次性的解决方案:

ssh -o ServerAliveInterval=60 myname@myhost.com

将其存储在别名中:

alias sshprod='ssh -v -o ServerAliveInterval=60 myname@myhost.com'

现在可以这样连接:

me@MyMachine:~$ sshprod

17
很酷,但不完全是“一次性解决方案”。如果您要连接到服务器超过一次,为什么不使用Host *ServerAliveInterval 240(或者如果您只想在像rockymonkey555的答案中的myname@myhost.com这样的特定主机名上使用,则指定主机名)?设置别名似乎并没有更容易的方式。 - Lambart
10
或者,在您的~/.bashrc中创建一个别名:alias ssh='ssh -o ServerAliveInterval=60' - Jabba
29
他的意思是“一次”的意思是“它只能使用一次”,而不是“我只需要写一次”。 - Jonathan Hartley
3
是的,如果你将"one time"解读为"单次使用",那么这个内容就可以完美地完成任务。 - philraj
7
如果你想要一行代码将ServerAliveInterval设置为60,那很好。然而,如果你可以使用.ssh/config而不是使用bash别名,那就太傻了。 - Cameron Tacklind
显示剩余3条评论

82

似乎没有名为"ClientAliveInterval"的参数,只有"ServerAliveInterval",你可以在手册页面"man ssh_config"中查看。 - dtj
11
那个不对,应该在“man sshd_config”中查看运行ssh守护进程的服务器部分配置,而不是客户端配置。 - Jeff Davenport
我应该使用ClientAliveInterval让服务器检查客户端是否存活,还是让客户端重复使用ServerAliveInterval“ping”服务器?两者似乎都没有意义。 - droid192
3
只有在希望服务器断开不响应的死连接时,才需要在服务器上设置“ClientAliveInterval”,您可以自定义断开连接的时间和频率。 - Jeff Davenport
1
在我的情况下,服务器端设置了 ClientAliveInterval 15ClientAliveCountMax 2,客户端设置了 -o reconnect,在通过 sshfs 传输大文件时运行良好,没有卡顿。 - allenyllee

37

putty设置

提醒:Putty用户可以在这里设置选项


17
我们可以通过以下全局配置使ssh连接保持活跃。
将以下行添加到/etc/ssh/ssh_config文件中:
ServerAliveInterval 60

这只适用于客户端还是也适用于sshd? - Edward Coast
2
@EdwardCoast 它在客户端机器上运行良好。我在 Mac 上进行了测试。 - minhas23

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