2

このコードを使用して、サーバーを known_hosts に追加しています。

subprocess.Popen(['sshpass', '-p', password, 'ssh', '-o', 'StrictHostKeyChecking=no', add_key], stdout=subprocess.PIPE).communicate()[0]

これにより、ホスト名が known_hosts に追加されますが、サーバーはホストに入ろうとしてハングします。ホスト名をknown_hostsに追加して、他のコードを続行したいだけです。どうやってやるの?ありがとう

4

2 に答える 2

1

これでうまくいくはずです。このソリューションは、コマンドを自動化するための優れた方法であるpexpectライブラリを使用します。基本的に、追加するホスト、ユーザー、パスワードを使用してadd_known_hostsを呼び出します。そのホストにSSHで接続しようとし、パスワードを入力するか、既知のホストへの追加接続にyesで応答してから、パスワードを入力します。最後に、exitコマンドを送信して接続を正常に終了します。これを変更して、ユーザー名とパスワードを必要とせずに、接続を続行する質問に「はい」と答えてから、パスワードプロンプトを続行する代わりにsshプロセスを終了することができます。

import pexpect, time

def add_known_hosts(host, user, password):
    child = pexpect.spawn('ssh %s@%s' % (user, host))
    i = child.expect(['.* password:', '.* continue connecting (yes/no)?'])
    if i == 1:
        child.sendline('yes')
        child.expect('.* password:')
    child.sendline(password)
    child.expect('%s@%s' % (user, host))
    time.sleep(1)
    child.sendline('exit')

add_known_hosts('myhost', 'myusername', 'mypassword')

デバッグ

以下のコメントから、システムでpexpectを使用する際に問題が発生しているようです。pexpectがsshで正しく機能していることを確認するための簡単なテストを行うための良い方法は、以下のコードを実行することです。ホスト、ユーザーに適切な設定を入力してからコードを実行すると、sshセッションを操作できるようになります。この時点で、ここから構築して、sshから取得する予定のテキストと、それに応じて送信するテキストを正確に確認できます。

import pexpect
host, user = 'myhost', 'myusername'
child = pexpect.spawn('ssh %s@%s' % (user, host))
child.interact()
于 2012-11-28T04:08:10.797 に答える
0

気にしないで、自分で解決しました。これが私がしたことです:

test = subprocess.Popen(['sshpass', '-p', password, 'ssh', '-o', 'StrictHostKeyChecking=no', add_key])
            time.sleep(5.0)
            test.kill()

ありがとう!

于 2012-11-28T12:26:29.470 に答える