大多数sshd安装的默认限制为10个连接。如果超过此值,则尝试连接到服务器的所有用户都将收到错误ssh_exchange_identification: Connection closed by remote host
。这可以通过简单的bash onliner for i in {0..12}; do nc targetserver.com 22 & done
来证明。我还写了一个python脚本来演示这个:
#!/usr/bin/env python
import socket
socks=[]
print "Building sockets. . ."
for i in range(20):
socks.append(socket.socket(2,1))
socks[i].connect(('localhost',22))
while 1:
pass
print "Done."
完美无缺。然后我尝试使用ruby创建相同的脚本:
#!/usr/bin/env ruby
require 'socket'
socks = Array.new(20)
puts "Building sockets...\n"
for i in 0..19
socks[i] = TCPSocket.new('localhost', 22)
end
puts "Done.\n"
while (true) do
end
ruby脚本没有出现任何错误并打印出预期的输出,但不会导致阻止其他用户连接到ssh。我验证了ruby脚本是用我写的另一个python脚本创建套接字:
#!/usr/bin/python
from socket import socket as sock, SO_REUSEADDR as REUSE, SOL_SOCKET as SOL
host='localhost'
port=5555
s=sock(2,1)
s.setsockopt(SOL, REUSE, 1)
s.bind((host,port))
s.listen(port)
i=0
while 1:
s.accept()
i += 1
print i
并将目标端口更改为5555。 唯一想到的是套接字可能正在关闭,但我不知道为什么会这样。还有什么能阻止这个脚本工作吗?