【发布时间】:2018-04-26 08:18:13
【问题描述】:
我有一个服务器主机 (S) 和一堆客户端 (C1, C2, C3, ...)。我想分别打开 S 和 C1、C2、C3 之间的连接以进行双向通信。理想情况下使用套接字。用于授权目的的 SSH 是首选。
理想情况下:
- 客户端 C1 创建到 S 的 SSH 反向隧道,转发 C1 的端口,因此它可以在 S 上作为自己的端口访问。
- 在 C1 上运行的客户端程序创建一个套接字并绑定到转发端口。
- 在 S 上运行的服务器程序创建一个套接字并绑定到转发端口。
- 客户端和服务器可以交换数据。
这样的事情可能吗?我尝试使用 Python 编写草稿,但无济于事:
首先,我在 C1 上运行:ssh -N -R 9999:localhost:15432 root@example.com - OK
其次,在我运行的服务器上:
import socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 9999))
serversocket.listen(5)
while True:
connection, address = serversocket.accept()
buf = connection.recv(64)
if len(buf) > 0:
print buf
break
第三,我在客户端运行:
import socket
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('localhost', 15432))
clientsocket.send('hello')
但我在客户端收到socket.error: [Errno 111] Connection refused。另外,如果我先设置隧道然后启动服务器程序,我会得到[Errno 98] Address already in use。它只在我第一次启动程序,然后设置隧道时才有效。
如果上述概念没有意义,您建议创建一种同步工具,以便任何客户端侦听来自服务器的查询并可以响应数据? (最好在 Python 中)。
提前致谢。
【问题讨论】:
标签: sockets networking ssh network-programming ssh-tunnel