保持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 15ClientAliveCountMax 2 和客户端设置 -o reconnect 在通过 sshfs 传输大文件时效果很好,不会卡住。【参考方案4】:

FYI Putty 用户可以在此处设置选项

【讨论】:

【参考方案5】:

我们可以通过以下全局配置来保持 ssh 连接处于活动状态

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

ServerAliveInterval 60

【讨论】:

只对客户端有效还是对 sshd 也有效? @EdwardCoast 它在客户端机器上工作。我在 Mac 上测试过

以上是关于保持SSH会话活动[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

教你关闭一个不活动的或者空闲的SSH会话

保持远程桌面会话“活动”[关闭]

Android - 保持会话活动直到关闭(直到用户注销)

保持 ASP.NET 会话打开/活动

关闭 SSH 时保持 Django 运行服务器处于活动状态

重用 HttpURLConnection 以保持会话活动