关于使用Python启动SSH隧道的问题
从用Python编写的HTTP RPC服务器启动SSH隧道时遇到了问题 基于Python的BaseHTTPServer,有一个简单的HTTP RPC服务器是用Python编写的。 作为其中一项服务的一部分,我想启动一个从RPC服务器到远程机器的SSH隧道。我使用os.system在RPC调用调用的Python脚本中启动SSH隧道关于使用Python启动SSH隧道的问题,python,ssh,Python,Ssh,从用Python编写的HTTP RPC服务器启动SSH隧道时遇到了问题 基于Python的BaseHTTPServer,有一个简单的HTTP RPC服务器是用Python编写的。 作为其中一项服务的一部分,我想启动一个从RPC服务器到远程机器的SSH隧道。我使用os.system在RPC调用调用的Python脚本中启动SSH隧道 os.system("ssh -f -n -N -L 127.0.0.1:%d:localhost:%d user@%s" % (6800, 9000, "remote
os.system("ssh -f -n -N -L 127.0.0.1:%d:localhost:%d user@%s" % (6800, 9000, "remote.machine"))
乍一看,一切似乎都很好,因为隧道开始了,我可以使用它,但有一件事我注意到了。除了侦听端口6800之外,SSH还开始侦听端口8001(HTTP RPC服务器运行的端口)
以下是关于RPC服务器和SSH的lsof输出:
rpc.py 27763 usern 5u IPv4 102130428 TCP 127.0.0.1:8001 (LISTEN)
ssh 1951 usern 14u IPv4 102149728 TCP 127.0.0.1:6800 (LISTEN)
ssh 1951 usern 5u IPv4 102130428 TCP 127.0.0.1:8001 (LISTEN)
在RPC服务器重新启动之前,一切正常。在重新启动期间,RPC服务器被迫关闭与侦听套接字的连接,但SSH的连接保持打开状态,RPC服务器无法在同一端口上再次启动
SSH隧道似乎也以某种方式将自己与RPC服务器的侦听套接字的fd相关联
有人能给我们一些提示,如何从脚本中设置SSH隧道,让它只监听假定的端口(本例中为6800)。我怀疑这与分叉,然后告诉SSH从调用过程中分离(“f”)有关 另外,不确定这是否有帮助,但如果python足够现代化,您应该真正使用subprocess模块。您考虑过将其用于SSH吗?(取决于PyCrypto,但除此之外是纯Python) 这将使管理连接变得更简单,并且根据服务器处理套接字的方式,您可能只需要设置一个paramiko通道,然后让服务器像对待任何其他侦听套接字一样对待它 (在paramiko中,传输对象表示基本的SSH2连接,对于每个传输,您可以创建多个通道对象,每个通道对象充当常规Python套接字的插入式替换) 以下是一些参考资料,以备您查看:
- (提供了一个设置传输的简单示例)
- (直接链接到运输文件。开放式渠道)
理论上,我相信您还应该能够在调用os.system()之前,使用fcntl将侦听套接字的文件描述符设置为在exec(FD_CLOEXEC)上关闭。有什么进展吗?如果人们提供状态更新,我们通常会更好地帮助他们。如果您.split()该字符串,您所拥有的应该可以使用。从文档中可以看到:“args应该是一个字符串,或者是一系列程序参数”,在UNIX上,shell=True:如果args是一个字符串,它指定了要通过shell执行的命令字符串。您是对的。当我使用这种方法时,由于不同的原因我出现了一个错误。您可以尝试使用
import subprocess
subprocess.Popen("ssh -f -n -N -L 127.0.0.1:%d:localhost:%d user@%s" % (6800, 9000, "remote.machine"), shell=True, close_fds=True)