【发布时间】:2020-06-15 00:13:49
【问题描述】:
我有一个服务器列表和 ip:ports(外部地址),我需要检查每个服务器是否可以连接到这些地址。
遍历文件并尝试打开一个 sshtunnel 并进行如下连接
tunnel=sshtunnel.SSHTunnelForwarder(
ssh_host=host,
ssh_port=22,
ssh_username=ssh_username,
ssh_pkey=privkey,
remote_bind_address=(addr_ip, int(addr_port)),
local_bind_address=('0.0.0.0', 10022)
#,logger=sshtunnel.create_logger(loglevel=10)
)
tunnel.start()
# use socket
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
res = s.connect(('localhost', 10022))
print(res)
#s.connect((addr_ip, int(addr_port)))
s.close()
except socket.error as err:
print('socket err:')
print(err)
finally:
s.close()
time.sleep(2)
tunnel.stop()
当我这样做时,即使远程不正确,响应也始终为 0(即 sock 可以连接到本地绑定) - 但是 sshtunnelforwarder 会抛出
ERROR | Secsh channel 0 open FAILED: Network is unreachable: Connect failed
ERROR | Could not establish connection from ('127.0.0.1', 10022) to remote side of the tunnel
如何让我的套接字命令检查 remote_bind_address 是否可用?
我尝试使用 telnetlib,但遇到类似问题
代码实际上与替换为的套接字块相同
tn=telnetlib.Telnet()
tn.open('localhost',10022)
tn.close()
我对这一切都比较陌生,所以还在学习。如果有更好的方法来实现我需要做的事情,请告诉我。
谢谢
【问题讨论】:
-
我的替代方案是使用 paramiko.SSHclient 并使用 exec_command 进行远程登录,但我宁愿尝试使用 python 完成所有操作,而不是在服务器上调用命令。
标签: python sockets paramiko ssh-tunnel telnetlib