对于Python中基于TCP的通信来说,这是一个新问题。我正在尝试通过SSH隧道和Python套接字模块在两个*NIX系统之间建立基于TCP的通信。我使用了Python MOTW网站上的前两个示例"echo server“和"echo client”:http://www.doughellmann.com/PyMOTW/socket/tcp.html。
通信在相同的*NIX系统(HOST1)上工作良好,但在ssh隧道上失败。
我用ssh -L 10000:HOST2:10000 USERNAME@HOST2登录了第二个*NIX系统。然后,我尝试以相同的方式建立通信,在HOST2上启动服务器的python脚本,在HOST1上启动客户端的脚本。这是我在stderr上得到的:
python test_socket_client.py
connecting to localhost port 10000
Traceback (most recent call last):
File "test_socket_client.py", line 10, in <module>
sock.connect(server_address)
File "<string>", line 1, in connect
socket.error: [Errno 111] Connection refused当我分别在HOST1和HOST2上启动服务器和客户端,反之亦然时,我得到了相同的消息。
我做错了什么?
发布于 2012-01-20 19:21:22
您的服务器将其套接字绑定到localhost:10000 --这意味着它只侦听来自环回接口的连接。SSH命令行指示SSH将连接到端口10000的本地连接通过隧道传输到连接到HOST2:10000的连接。您的客户机Python程序连接到localhost:10000,然后SSH链接的远端尝试连接到HOST2:10000。尽管这与您的套接字绑定到的端口和机器相同,但它是一个不同的接口,您的套接字不会侦听它。
将SSH命令行更改为ssh -L 10000:localhost:10000 USERNAME@HOST2,或者将服务器的侦听套接字绑定到所有接口:server_address = ('', 10000)。空字符串用作INADDR_ANY。
当然,Gary van der Merwe所说的是对的:在HOST1上运行客户机Python程序时,需要运行SSH。
发布于 2012-01-20 19:13:44
我将检查您的服务器是否正在监听服务器主机,以及ssh客户机是否正在监听客户机主机。可以运行netstat -tnlp来检查这一点。
您确定在运行客户端时ssh客户端仍处于打开状态吗?您要么需要在一个终端上运行shh,而在另一个终端上运行您的客户机,要么运行ssh -Nf,这会导致ssh在通过身份验证后转到后台。
https://stackoverflow.com/questions/8939607
复制相似问题