逆の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セッションを設定することですが、現在この機能を提供する既存のパッケージ化されたソリューションが見つかりませんでした。
使用paramiko StrictHostKeyCheckingないために "頼む" から以下のキーを変更します。http://をwww.paramiko.org/ –
paramikoと見なされていないドキュメントを見てどこでも逆オプションを提供します。つまり、ターゲットサーバーはソースサーバーにsshを戻すことができません。 – Tich