3

次のコードを使用して、pexpectを介してsshトンネルをセットアップしようとしています。

#!/bin/env python2.4

import pexpect, sys
child = pexpect.spawn('ssh -CfNL 0.0.0.0:3306:127.0.0.1:3306 user@server.com')
child.logfile = sys.stdout
while True:
    code = child.expect([
        'Are you sure you want to continue connecting \(yes/no\)\?',
        'password:',
        pexpect.EOF,
        pexpect.TIMEOUT
    ])
    if code == 0:
        child.sendline('yes')
    elif code == 1:
        child.sendline('passwordhere')
    elif code == 2:
        print ".. EOF"
        break
    elif code == 3:
        print ".. Timeout"
        break

私が期待しているのは、パスワードが送信されてsshトンネルが確立された後、whileループが終了して、他のビジネスロジックで処理を続行できるようにすることです。

ただし、上記のコードは、sshトンネルが確立されている場合、utilタイムアウト(約30秒)をブロックします。

ブロックを回避する方法について誰かアドバイスをいただけますか?

4

1 に答える 1

3

ssh最も簡単な解決策は、sshホストキー認証をバックグラウンドと組み合わせて使用​​ することだと思います&...これは非常に基本的な実装ですが、完了後にプロセスを強制終了するように拡張できます...また、私がプロセスをバックグラウンド処理しているため、引数に追加さ-nれます。ssh

import subprocess

USER = 'user'
HOST = 'server.com'
cmd = r"""ssh -CfNnL 0.0.0.0:3306:127.0.0.1:3306 %s@%s &""" % (USER, HOST)
subcmd = cmd.split(' ')
retval = subprocess.Popen(subcmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stat = retval.poll()
while stat == None:
    stat = retval.poll()
print "ssh in background"

最後に、まだ を持っていない場合は、 asを呼び出して、トンネルの損失をできるだけ早く検出し、パス内の NAT 実装からエージング アウトしないようにすることを検討してください (非アクティブの間) ServerAliveIntervalssh_configsshssh -o ServerAliveInterval=30 <other_options_and_args>

于 2011-06-22T04:34:05.350 に答える