我正在尝试设置 Windows OpenSSH 服务器(v1.0.0.0-Beta),但遇到了一个问题。
我有一个使用 plink 创建 ssh 连接的程序。连接数范围为 1-200,我很确定这应该是安全的。但是,当我创建了 50 个连接时,恰好 50ssh 连接,ssh 服务器开始拒绝连接并查看日志,它显示 posix_spawn 失败,并且它无法再实例化子进程来处理连接
我试过了关联但它没有起到任何作用。我非常感谢你的帮助。谢谢!
这是第 51 个连接时的错误日志
1656 2018-03-05 16:08:05.610 debug3: fd 5 is not O_NONBLOCK
1656 2018-03-05 16:08:05.610 debug3: spawning "C:\\OpenSSH\\sshd.exe" "-R"
1656 2018-03-05 16:08:05.610 error: posix_spawn failed
1656 2018-03-05 16:08:05.610 debug3: send_rexec_state: entering fd = 8 config len 357
1656 2018-03-05 16:08:05.610 debug3: ssh_msg_send: type 0
1656 2018-03-05 16:08:05.610 debug3: send_rexec_state: done
1656 2018-03-05 16:08:05.610 debug3: ReadFileEx() ERROR:109, io:00000010C2BF98B0
这是我的配置
Subsystem sftp sftp-server.exe
LogLevel Debug3
AllowAgentForwarding yes
AllowTcpForwarding yes
GatewayPorts yes
TCPKeepAlive yes
MaxStartups 1000
PasswordAuthentication yes
PermitTTY yes
PidFile C:/ProgramData/ssh/sshd.pid
MaxSessions 1000
答案1
因此,我在他们的 github 页面上为此开了一个问题,并得到了一个不幸的答案,
显然,这是他们代码中的硬编码限制,因为 Windows 每个线程不能有更多句柄,他们不想使用多线程并使其变得更加复杂。我在下面附上了 github 问题的链接
以下是他们的回复
最终,所有这些子进程句柄都将在 WaitForMultipleObjects 调用中输入(作为 wait_for_any_event() 的一部分),并且该 Win32 API 调用的句柄数限制为 64 个。我不得不选择一个小于这个数字的数字来容纳其他事件(异步接受和连接调用的事件)。超出这些限制将导致多线程 POSIX 兼容层,这将使其更加复杂且弹性更差。
答案2
Bitvise SSH 可以处理超过 50 个并发用户:https://fogbugz.bitvise.com/default.asp?WinSSHD.1.7313.1
不属于 BitVise,但尝试过 MS 的 OpenSSH、MobaSSH,并且 BitVise SSH 服务器具有最佳的开箱即用体验