.ssh/config
我的文件中有以下条目
Host AAA
User BBB
HostName CCC
ControlMaster auto
ControlPath ~/.ssh/%r@%h:%p
上面的内容允许我通过同一个 ssh 连接复用多个 ssh 会话,而不必每次需要新会话时都输入密码(只要主连接保持打开状态)。
但是,我注意到,一旦多路复用的连接数相对较高(~7),我就无法向同一个多路复用连接添加更多会话,并且开始出现以下错误:
> ssh -X AAA
mux_client_request_session: session request failed: Session open refused by peer
Password:
我的问题:
为什么我会收到此错误?我可以在同一连接中多路复用的 ssh 会话数量是否有限制?我可以更改该限制吗?这是一个坏主意吗?
答案1
服务器上的守护程序sshd
限制每个网络连接的会话数量。这是由MaxSessions
中的选项控制的/etc/ssh/sshd_config
。此外,MaxStartups
如果您使用大量会话,则可能需要增加该选项。 (更多详情请参阅参考资料。) 修改限制man sshd_config
的选项MaxSessions
已在 OpenSSH 5.1 中引入看起来该数字之前被硬固定为 10。如果MaxSessions
在服务器上超出,您将sshd[####]: error: no more sessions
在服务器日志中看到。
答案2
我在使用早期版本 OpenSSH 的服务器上遇到了这个问题。我控制服务器,并通过在命名配置中创建两个 CNAME 解决了问题:
realhost.myexample.com. IN A XXX.XXX.XXX.XXX
realhost2.myexample.com. IN CNAME realhost.myexample.com.
realhost3.myexample.com. IN CNAME realhost.myexample.com.
然后,在我的本地 ssh 客户端配置中:
ControlMaster auto
ControlPath ~/.ssh/%r_%p_%h
host realhost
hostname realhost.myexample.com
host realhost2
hostname realhost2.myexample.com
host realhost3
hostname realhost3.myexample.com
ControlPath 语句是为了使控制套接字名称不会相互冲突。
就是这样,但为了使其易于管理,我在客户端为“ssh”编写了一个包装脚本。它知道存在主机“组”(在本例中,realhost、realhost1、realhost2 组成一组)。当发出“sshwrapper realhost”时,如果没有打开的通道,则所有三个通道都会打开,并开始一个会话。下次运行时,它会计算每个通道的打开连接数,并在连接数最少的通道中打开新会话。
使用一台真实主机和两台“假”主机,我可以在收到错误之前连接 30 次。登录速度非常快,除了初始时间需要一两秒,因为此时所有三个控制通道都已打开。