关于使用Python启动SSH隧道的问题

2024-05-14 11:25:25 发布

您现在位置:Python中文网/ 问答频道 /正文

从用Python编写的HTTP RPC服务器启动SSH隧道时遇到问题。

有一个基于Python的BaseHTTPServer,用Python编写的简单HTTP-RPC服务器。 作为服务的一部分,我想启动一个从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)。


Tags: 端口服务器脚本httposrpcsystemssh
3条回答

您是否考虑过为SSH使用paramiko?(取决于PyCrypto,但其他方面则是纯Python)

这将使管理连接变得更简单,而且,根据服务器处理套接字的方式,您可能只需要设置一个paramiko通道,然后让服务器将其视为任何其他侦听套接字。

(在paramiko中,传输对象表示基本的SSH2连接,对于每个传输,您可以创建多个通道对象,每个通道对象充当常规Python套接字的替换项)

以下是一些资源,以备您查看:

我怀疑这与分叉,然后告诉ssh从调用进程中分离(“-f”)有关。

另外,不确定这是否有帮助,但是如果您的python足够现代化,可以使用subprocess模块。

尝试使用subprocess.Popen()而不是os.system(),并设置close_fds=True(在Python2.4及更高版本中可用)。

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)

理论上,我认为您还应该能够在调用os.system()之前使用fcntl将侦听套接字的文件描述符设置为在exec(FD_CLOEXEC)上关闭。

相关问题 更多 >

    热门问题