2017-06-28 15 views
0

逆のSSHトンネルを設定するためにPythonを使用しようとしています。システムで始まるソフトウェアの中には、それを管理して終了させるものや、受け取ったコマンドに基づいて開始するものがあります。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()を使ってみると、接続を確立して出力を受け取ることがわかります。ただし、関数の終了直後に、サブプロセスも終了します。

私は、ルートユーザーと一般ユーザーの両方に対してRSAキーペアを設定しました。コマンドをコピーして端末に貼り付けても、即時終了バグは発生しません。

目的は、リモートユーザーがログインできるように逆SSHセッションを設定することですが、現在この機能を提供する既存のパッケージ化されたソリューションが見つかりませんでした。

+0

使用paramiko StrictHostKeyCheckingないために "頼む" から以下のキーを変更します。http://をwww.paramiko.org/ –

+0

paramikoと見なされていないドキュメントを見てどこでも逆オプションを提供します。つまり、ターゲットサーバーはソースサーバーにsshを戻すことができません。 – Tich

答えて

0

あなたは奇妙なssh接続を行っています。私の助言は、paramikoを素晴らしいsshパッケージを使用することです。 一方で、あなたはサブprocessioning uがその使用のようにそれを好むので、もしLinuxのcommamdのためにのみ、次のとおりです。 sshpassをインストール(yumをインストールするか、apt-getを) sshpass -p your_passwordにsshのユーザ@ホスト名

と代わりにuが送信され、フラグの設定を変更: 変更はssh_config viのは/ etc/sshを/ ssh_configの "なし"

+0

逆のトンネルを設定しているのでコマンドが変わってしまい、もう片方で 'ssh [email protected] -p 19999'を使うことができます。これが主な機能ですが、SSHコマンドが機能します。しかし、私が使用するオプションを提供するライブラリはありません。問題は、SSHコマンドが生き残っていないことです。もう片方で役に立つことができる前に、SSHコマンドが強制終了されます。 – Tich

関連する問題