我尝试使用Python设置反向SSH隧道。一些以系统开始的软件会管理它并杀死它,或者根据它收到的命令启动它。SSH命令立即退出,而不是作为python子进程保持生存
我写了一个类,如下所示管理反向隧道:
# imports omitted for brevity
class SshProcess():
def __init__(self):
self.process = None
def start(self, port):
if self.process is not None:
return None
command = [
# 'sudo',
'ssh',
'-R {port}:127.0.0.1:22'.format(port=port),
'{username}@{host}'.format(username=config.USERNAME, host=config.HOST),
'-o StrictHostKeyChecking=no'
]
def threaded_popen():
self.process = subprocess.Popen(
(' '.join(command)), # command, # shlex.split(command),
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
shell=True
)
self.process.wait()
logger.info('Reverse SSH to {username}@{host} has exited'.format(username=config.USERNAME, host=config.HOST))
logger.debug('command raw: {command}'.format(command=command))
logger.debug('command joined: {command}'.format(command=(' '.join(command))))
self.thread = Thread(target=threaded_popen)
self.thread.start()
def stop(self):
if self.process is not None:
try:
self.process.communicate(input="exit\n")
self.process.terminate()
except (ValueError, OSError) as e:
logger.warning('Closing reverse SSH raised {error}'.format(error=e.__class__.__name__))
logger.warning(e)
self.process = None
if self.thread is not None:
self.thread.join()
现在,每当我打电话开始我收到以下日志语句:
2017-06-28 14:32:46,343 - module - DEBUG - command raw: ['ssh', '-R 4000:127.0.0.1:22', '[email protected]', '-o StrictHostKeyChecking=no']
2017-06-28 14:32:46,344 - module - DEBUG - command joined: ssh -R 4000:127.0.0.1:22 [email protected] -o StrictHostKeyChecking=no
2017-06-28 14:32:46,797 - module - INFO - Reverse SSH to [email protected] has exited
的问题是SSH隧道出口几乎立即启动后。在Linux中执行一个简单的pidof ssh
不会提供输出,就好像该进程不存在一样。
我也尝试使用communicate()
在启动过程后,您可以看到它建立连接并接收输出。然而,在函数退出后不久,子进程也会退出。
我已经为root用户和普通用户设置了RSA密钥对。将该命令复制并粘贴到终端中不会产生即时退出错误。
目的是设置反向SSH会话,以便远程用户可以登录。但是,我目前还没有找到现有的提供此功能的打包解决方案。
使用的paramiko以下重点:HTTP:// www.paramiko.org/ –
考虑paramiko,看看它似乎并不像在任何地方提供反向选择。意味着目标服务器无法退回源服务器。 – Tich