2012-04-27 12 views
0

pythonを使っていくつかのシェルコマンドを実行する必要がありますが、問題の1つを解決できませんでした。別のマシンにscpすると、通常、このマシンを既知のホストに追加するかどうかを尋ねるメッセージが表示されます。プログラムが自動的に「はい」を入力するようにしたいが、動かすことができなかった。私のプログラムはこれまでのところ次のようになっています:python:Popenを使ってshellコマンドと対話する

from subprocess import Popen, PIPE, STDOUT 

def auto(): 
    user = "abc" 
    inst_dns = "example.com"  
    private_key = "sample.sem" 
    capFile = "/home/ubuntu/*.cap" 

    temp = "%[email protected]%s:~" %(user, inst_dns) 
    scp_cmd = ["scp", "-i", private_key, capFile, temp] 

    print ("The scp command is: %s" %" ".join(scp_cmd)) 
    scpExec = Popen(scp_cmd, shell=False, stdin=PIPE, stdout=PIPE) 
    # this is the place I tried to write "yes" 
    # but doesn't work 
    scpExec.stdin.write("yes\n") 
    scpExec.stdin.flush() 
    while True: 
    output = scpExec.stdout.readline() 
    print ("output: %s" %output) 
    if output == "": 
     break 

私はこのプログラムを実行すると、プロンプトが表示され、入力を求めます。プロンプトに自動的に応答する方法は?ありがとう。

+1

'-q'フラグは役に立ちませんか? 'man'は '-q静かなモード:ssh(1)からの警告と診断メッセージだけでなく、進捗メーターも無効にします。 ' –

+0

@LevLevitsky:まあ、実際には警告を黙らせるだけですが、既知のホストに追加するのが標準です私は思います。 –

+2

おそらく、あなたはsshのサブプロセスの代わりにhttp://www.lag.net/paramiko/を使う方が良いでしょう。 –

答えて

4

sshがStrictHostKeyCheckingに設定されているため、ホスト鍵をknow hostsファイルに追加するように求められます。このフラグは、「はい」は、ssh(1)は自動的にの〜/ .ssh/known_hostsファイル ファイルにホスト鍵を追加することは決してありませんように設定し、することを拒否された場合

StrictHostKeyChecking

:manページからホストキーが変更されたホストに接続します。これは、/ etc/ssh/ssh_known_hostsファイルが であるか、または新しいホストへの接続が頻繁に行われている場合に、迷惑になることがありますが、トロイの木馬攻撃に対して最大限の保護 を提供します。このオプションを使用すると、ユーザーは にすべての新しいホストを手動で追加するよう強制されます。このフラグが "no"に設定されていると、sshは新しいホスト鍵 をユーザーの既知のホストファイルに自動的に追加します。このフラグが「尋ねる」に設定されている場合は、新しいホスト鍵は、ユーザーは、彼らが本当に何をしたいかであることを確認した、とsshは

あなたが設定することができます後にのみ、ユーザー 既知のホストファイルに追加されますStrictHostKeyCheckingを "いいえ"に設定すると、ssh/scpがプロンプトを表示せずに新しいキーを自動的に受け入れるようになります。コマンドラインで:

scp -o StrictHostKeyChecking=no ... 

また、バッチモードを有効にすることができます:「はい」に設定した場合BATCHMODE

、パスフレーズ/パスワード照会は

無効になります。このオプションは、パスワードを入力するユーザが存在しないスクリプトや 他のバッチジョブで便利です。引数は "yes"または "no"でなければなりません。デフォルトは "no"です。

BatchMode=yesとすると、プロンプトではなくssh/scpが失敗することがあります(スクリプトの改善が必要なことが多い)。

+0

解決策の点で素晴​​らしい答え!私はまだpythonの立場からの答えを期待していますが。 :) –

1

指紋照合について尋ねられないように私が知っている最良の方法は、.ssh/known_hostsに関連するキーをあらかじめ入力することです。ほとんどの場合、あなたは本当にリモートマシンの公開鍵が何であるかを既に知っているはずです。そして、それらをsshが見つけることができるknown_hostsに入れるのは簡単です。

リモート公開鍵を知っていないし、知ることができない場合もありますが、最も正確な解決方法は、わからない理由によって異なります。たとえば、任意のボックスで実行する必要のあるソフトウェアを作成していて、ユーザーの代わりに他の任意のボックスにSSHする必要がある場合は、ソフトウェアでssh-keyscanを実行して表面のリモート可能であれば、ユーザに明示的に承認または拒否させ、承認されている場合はknown_hostsに鍵を追加してとし、はsshを呼び出します。

関連する問題