使SSH会话保持活动状态


241

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

问题

当我在工作场所时,它始终保持连接并且可以正常工作。不幸的是,在我从家里连接远程服务器后,终端会在10到15分钟内死机。

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

输入w检查登录用户时,有一些僵尸登录用户在那里,我必须手动将其杀死。

这很烦人。谁能帮我?


我也有这个,我开始使用screen。也许这是超时问题。
马丁

@martin screen帮助保持程序运行。不幸的是有时我必须在远程服务器上工作:(
Haifeng Zhang

如果不带参数启动它,那么将为您提供一个外壳。
马丁

你是在说screen什么 它可以解决丢失的连接问题吗?不是screen -S screenName吗 我始终将屏幕与-S-r
Zhang Haifeng Zhang

1
不,这不能解决问题,只能避免在终端中失去工作。如果您什么都不做,它仍然会冻结,您可以从开始的地方接起。我的意思是,您可以创建一个终端,您可以始终使用来恢复该终端screen。您似乎已经知道了;)
马丁

Answers:


449

在客户端运行的ssh守护程序(sshd),如果客户端变为静默(即,不发送信息),则从服务器端关闭连接。为了防止连接丢失,请指示ssh客户端不时向服务器发送生命周期信号。

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

Host remotehost
    HostName remotehost.com
    ServerAliveInterval 240

要为所有主机发送保持活动信号,请在配置文件中放置以下内容:

Host *
    ServerAliveInterval 240

24
@ user271996,为什么要为客户端设置重新启动守护程序?
maxschlepzig 2015年

该配置只能是用户可写的。可读性不是问题。使用600作为您的权限级别是可以的,因为那只能用户写。
jbruni

1
以防万一,这个配置文件不在您的PC / linux机器上
zzapper 18/10/23

5
我总是对配置名称感到困惑:客户端使用,ServerAliveInterval 而服务器使用ClientAliveInterval 。真是一团糟。
youkaichao

@youkaichao通常会有这种困惑。作为API设计人员,我可能会同时采用两种方式。最终,最关键的是所选标准的好的文档。
卡梅隆·塔克林

170

我想要一次性解决方案:

ssh -o ServerAliveInterval=60 myname@myhost.com

将其存储在别名中:

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

现在可以这样连接:

me@MyMachine:~$ sshprod

12
这很酷,但不完全是“一次性解决方案”。如果你要连接到服务器超过一次,为什么不Host *ServerAliveInterval 240(或指定主机名,如果你只是想对myname@myhost.com在rockymonkey555的答案设置别名似乎并不容易以任何方式?
Lambart

8
或者,只需在〜/ .bashrc中创建一个别名:alias ssh='ssh -o ServerAliveInterval=60'
Jabba

15
他的意思是“一次”,就像“只能工作一次”,而不是“我只需要写一次”一样。
乔纳森·哈特利

1
是的,如果您将“一次性”读作“一次性使用”,则可以很好地完成工作。
philraj '19

如果您希望将“单线”设置ServerAliveInterval60,那就太好了。但是,在可能使用bash别名时,这很.ssh/config愚蠢。
卡梅隆·塔克林德

50

对于那些想知道的人,@ edward-coast

如果要为服务器设置保持活动状态,请将其添加到/etc/ssh/sshd_config

ClientAliveInterval 60
ClientAliveCountMax 2

ClientAliveInterval:设置超时间隔(以秒为单位),在此间隔之后,如果未从客户端接收到任何数据,则sshd(8)将通过加密的通道发送消息以请求客户端的响应。

ClientAliveCountMax:设置客户端活动消息(见下文)的数量,这些消息可以在sshd(8)接收不到来自客户端的任何消息的情况下发送。如果在发送客户端活动消息时达到此阈值,则sshd将断开客户端连接,从而终止会话。


似乎没有ClientAliveInterval这样的“参数”,只有ServerAliveInterval,您可以在手册页“ man ssh_config”中
dtj

6
那是错误的,在“ man sshd_config”中查找运行ssh守护程序的服务器部分,而不是客户端配置。
杰夫·达文波特

我应该使用ClientAliveInterval让服务器检查客户端是否还活着,还是应该让客户端ServerAliveInterval反复“ ping”服务器?两者似乎都没有意义
qrtLs

1
ClientAliveInterval当您希望服务器在无响应的无效连接上断开连接时,才在服务器上设置,您可以自定义发生频率和时间。
杰夫·达文波特


10

通过执行以下全局配置,可以保持ssh连接的活动状态

将以下行添加到/etc/ssh/ssh_config文件中:

ServerAliveInterval 60

这仅适用于客户端还是适用于sshd?
爱德华海岸

1
@EdwardCoast它在客户端计算机上工作。我在Mac上进行了测试
minhas23 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.