2017-06-28 36 views
0

我尝试使用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会话,以便远程用户可以登录。但是,我目前还没有找到现有的提供此功能的打包解决方案。

+0

使用的paramiko以下重点:HTTP:// www.paramiko.org/ –

+0

考虑paramiko,看看它似乎并不像在任何地方提供反向选择。意味着目标服务器无法退回源服务器。 – Tich

回答

0

你做了一些奇怪的SSH连接。我的建议是使用paramiko一个很好的SSH包。 在另一方面,你是子processioning只针对Linux COMMAMD所以如果u喜欢这样使用: 安装sshpass(YUM安装或易于得到) sshpass -p your_password SSH用户@主机名

和更改此设置代替ü发送的标志: 变化ssh_config中 VI的/ etc/SSH/ssh_config中 改变从 “问” 到 “无”

StrictHostKeyChecking没有

+0

该命令很奇怪,因为它设置了反向隧道,在另一端可以使用'ssh [email protected] -p 19999'。这是主要功能,SSH命令起作用。但没有图书馆提供我使用的选项。问题是,SSH命令不会保持活跃状态​​,它在另一端可以完成任何有用的事情之前被杀死。 – Tich