避免ssh连接超时和冻结GNOME终端的方法
当我通过ssh连接到某些服务器时,它会超时并 “冻结 "终端(不接受输入,不断开连接,不能Ctrl-C杀死ssh进程什么的)。
这个在Ubuntu的gnome-terminal
不过好像是暂停了终端的输入/输出,并不影响GNOME终端软件本身的运行。所以与其说是gnome-terminal
的bug,不如说是ssh烦人的不一致。
那么,有没有办法防止/恢复终端因ssh连接超时的情况?
当我通过ssh连接到某些服务器时,它会超时并 “冻结 "终端(不接受输入,不断开连接,不能Ctrl-C杀死ssh进程什么的)。
这个在Ubuntu的gnome-terminal
不过好像是暂停了终端的输入/输出,并不影响GNOME终端软件本身的运行。所以与其说是gnome-terminal
的bug,不如说是ssh烦人的不一致。
那么,有没有办法防止/恢复终端因ssh连接超时的情况?
sshd(服务器)如果一段时间内没有收到客户端的任何消息,就会关闭连接。你可以告诉你的客户端每隔一段时间向服务器发送一个生命信号。
这方面的配置在文件~/.ssh/config
中。要想每隔四分钟向远程host发送一次信号,请在~/.ssh/config
中加入以下内容。
Host remotehost
HostName remotehost.com
ServerAliveInterval 240
这是我在~/.ssh/config
中的配置。
要使所有主机都能使用。
Host *
ServerAliveInterval 240
同时确保运行chmod 600 ~/.ssh/config
,因为配置文件必须是不可读的。
接连按Enter、~、.来断开被冻结的会话。
ssh手册中的 “ESCAPE CHARACTERS "一节解释了其中的细节。
尽管这不是你问题的直接答案,但它与你的问题高度相关。你可以使用终端多路复用器,比如 screen
和tmux
,而不是试图保持连接的生命力 (所有的连接最终都会死亡),即使你的终端被断开,也能在后台保持会话的生命力。
基本上,当你登录到SSH服务器时,你会立即运行screen
,它将创建并附加一个新的会话:
$ screen
然后你就像平常一样使用shell进行工作。现在如果连接中断了,当你可以重新上线并通过SSH重新连接到服务器时,你会得到一个当前会话的列表。
$ screen -ls
要重新连接到一个会话:
$ screen -r <session>
其中<session>
是PID或一个会话名称。您将重新连接到您的会话,您可以从您离开的地方继续。
您甚至可以脱离会话并从原点重新连接,从您离开的地方开始。要脱离会话,您可以使用C-a
然后是C-d
(即Control + A
然后是Control + D
)。
还有【简单的在线教程】(http://www.mattcutts.com/blog/a-quick-tutorial-on-screen)。
在远程服务器上使用screen
和tmux
被认为是好的做法,也是高的推荐。有些人甚至将screen
作为他们的默认登录shell,所以当他们连接时,他们会立即开始一个新的screen
会话。
你也可以从SSH服务器端设置一个空闲超时间隔:
文件:/etc/ssh/ssh_config
内容。
ClientAliveInterval XX
ClientAliveCountMax YY
这与客户端设置的方式完全相同,但空包是从服务器发送的,而不是客户端。
提取自: http://www.sysadmit.com/2016/02/linux-y-vmware-ssh-evitar-desconexion.html 。
对于那些想在第一时间防止客户端超时的人来说。
你可以尝试在配置文件中设置ConnectTimeout 0
。值为0意味着除非关闭,否则连接将无限期地维持下去。
你的配置文件(或ssh_config)可能是这样的。
Host *
ConnectTimeout 0
在我的情况下,问题是在MTU大。如果你使用NAT,你可以在路由器上改变MTU,但我在服务器上改变MTU。
sudo /sbin/ifconfig eth0 mtu 1036
sudo /etc/init.d/networking restart
在Windows上,你也可以增加这个键:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"TcpMaxDataRetransmissions"=dword:00000010
```。