保持SSH会话活动[关闭]
Posted
技术标签:
【中文标题】保持SSH会话活动[关闭]【英文标题】:Keep SSH session alive [closed] 【发布时间】:2014-09-24 21:31:17 【问题描述】:我使用ssh -p8520 username@remote_host
登录远程服务器。
问题:
当我在工作场所时,它始终保持连接并正常工作。不幸的是,在我从家里连接远程服务器后,终端会在 10 到 15 分钟内冻结。
控制台上没有错误/超时报告,但光标无法再移动。
输入w查看登录用户时,有一些僵尸登录用户,我要手动杀掉。
这很烦人。谁能帮我?
【问题讨论】:
我也有过这个,我开始用screen
。也许这是某种超时问题。
@martin screen
有助于保持程序运行。不幸的是,有时我必须在远程服务器上工作:(
如果你不带参数启动它,这会给你一个shell。
你说的只有screen
吗?它可以解决丢失连接的问题吗?没有screen -S screenName
?我总是使用带有-S
和-r
的屏幕
不,这并不能解决问题,您只能避免在终端中丢失您的工作。如果你不做任何事情,它仍然会冻结,你可以从你开始的地方开始。我的意思是您可以创建一个终端,您可以随时使用screen
恢复该终端。你似乎已经知道了;)
【参考方案1】:
在服务器端运行的 ssh 守护进程 (sshd) 在客户端进入静默状态(即不发送信息)时关闭来自服务器端的连接。为防止连接丢失,请指示 ssh 客户端不时向服务器发送生命信号。
这个配置在文件$HOME/.ssh/config
中,如果文件不存在则创建文件(配置文件不能是世界可读的,所以在创建文件后运行chmod 600 ~/.ssh/config
)。每次发送信号,例如四分钟(240 秒)到远程主机,将以下内容放入该配置文件中:
Host remotehost
HostName remotehost.com
ServerAliveInterval 240
要为所有主机发送保活信号,请将以下内容放入配置文件:
Host *
ServerAliveInterval 240
【讨论】:
@user271996,为什么要为客户端设置重新启动守护程序? 以防万一此配置文件在您的 PC/Linux 机器上并不明显 我总是对配置名称感到困惑:客户端使用ServerAliveInterval
,而服务器使用ClientAliveInterval
。真是一团糟。
@youkaichao 经常有这种混淆。作为一名 API 设计师,我有理由将其放在两个方面。归根结底,最关键的是所选标准的良好文档。
@youkaichao 这就像你去卡尔家,在冰箱上的一张纸条上看到“迈克的地址:”。迈克的名字写在卡尔的家里并不令人困惑; Carl 是唯一一个不需要出现在 Carl 家里的名字。【参考方案2】:
我想要一个一次性的解决方案:
ssh -o ServerAliveInterval=60 myname@myhost.com
将其存储在别名中:
alias sshprod='ssh -v -o ServerAliveInterval=60 myname@myhost.com'
现在可以这样连接:
me@MyMachine:~$ sshprod
【讨论】:
这很酷,但不完全是“一次性解决方案”。如果您要多次连接到服务器,为什么不使用Host *
和 ServerAliveInterval 240
(或者指定主机名,如果您只希望 myname@myhost.com
使用它,如 rockymonkey555 的答案所示?设置别名不会看起来更容易。
或者,只需在你的 ~/.bashrc 中创建一个别名:alias ssh='ssh -o ServerAliveInterval=60'
他的意思是“一次”,因为“它只工作一次”,而不是“我只需要写一次”。
是的,如果您将“一次性”理解为“一次性使用”,则可以完美地完成这项工作。
如果你想要一个将ServerAliveInterval
设置为60
的“单行”,很好。但是,当您可以使用 .ssh/config
时使用 bash 别名只是愚蠢的。【参考方案3】:
对于那些想知道的人,@edward-coast
如果要设置保持活动for the server,请将其添加到/etc/ssh/sshd_config
:
ClientAliveInterval 60
ClientAliveCountMax 2
ClientAliveInterval:以秒为单位设置超时间隔,如果没有收到来自客户端的数据,sshd(8) 将通过加密通道发送消息以请求客户端响应。
ClientAliveCountMax: 设置客户端活动消息的数量(见下文),这些消息可以在 sshd(8) 未从客户端接收任何消息的情况下发送。如果在发送客户端活动消息时达到此阈值,sshd 将断开客户端连接,终止会话。
【讨论】:
好像没有ClientAliveInterval这样的“参数”,只有ServerAliveInterval,可以查看手册页“man ssh_config” 这是错误的,在“man sshd_config”中查看运行 ssh 守护进程的服务器部分,而不是客户端配置。 我应该使用ClientAliveInterval
让服务器检查客户端是否存活,还是应该让客户端用ServerAliveInterval
反复“ping”服务器?两者似乎都没有意义
如果您希望服务器在没有响应的死连接上断开连接,请仅在服务器上设置ClientAliveInterval
,您可以自定义发生这种情况的频率和时间。
就我而言,服务器端设置 ClientAliveInterval 15
和 ClientAliveCountMax 2
和客户端设置 -o reconnect
在通过 sshfs 传输大文件时效果很好,不会卡住。【参考方案4】:
FYI Putty 用户可以在此处设置选项
【讨论】:
【参考方案5】:我们可以通过以下全局配置来保持 ssh 连接处于活动状态
将以下行添加到/etc/ssh/ssh_config
文件:
ServerAliveInterval 60
【讨论】:
只对客户端有效还是对 sshd 也有效? @EdwardCoast 它在客户端机器上工作。我在 Mac 上测试过以上是关于保持SSH会话活动[关闭]的主要内容,如果未能解决你的问题,请参考以下文章