Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于使用Python启动SSH隧道的问题_Python_Ssh - Fatal编程技术网

关于使用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

从用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.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套接字的插入式替换)

以下是一些参考资料,以备您查看:

  • (提供了一个设置传输的简单示例)
  • (直接链接到运输文件。开放式渠道)
尝试使用subprocess.Popen()并设置close_fds=True(可在Python 2.4及更高版本中使用),而不是os.system()


理论上,我相信您还应该能够在调用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)