这是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上启动服务器和客户端时,我收到了相同的消息。
我做错了什么?
答案 0 :(得分:1)
您的服务器将其套接字绑定到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需要运行。
答案 1 :(得分:0)
我会检查您的服务器是否正在侦听服务器主机,并且ssh客户端正在侦听客户端主机。您可以运行netstat -tnlp
来检查此内容。
在运行客户端时,您确定自己的ssh客户端仍然处于打开状态。您需要在一个终端中运行shh,在另一个终端中运行客户端,或运行ssh -Nf
,这会导致ssh在经过身份验证后转到后台。