0

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

from subprocess import Popen, PIPE, STDOUT

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

  temp = "%s@%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

このプログラムを実行すると、プロンプトが表示され、入力を求められます。プロンプトに自動的に応答するにはどうすればよいですか? ありがとう。

4

2 に答える 2

5

ssh が 用に構成されているため、既知のホスト ファイルにホスト キーを追加するように求められますStrictHostKeyChecking。マニュアルページから:

StrictHostKeyChecking

このフラグが「yes」に設定されている場合、ssh(1) は自動的にホスト鍵を ~/.ssh/known_hosts ファイルに追加せず、ホスト鍵が変更されたホストへの接続を拒否します。これにより、トロイの木馬攻撃に対する最大限の保護が提供されますが、/etc/ssh/ssh_known_hosts ファイルの保守が不十分な場合や、新しいホストへの接続が頻繁に行われる場合は煩わしい場合があります。このオプションでは、ユーザーはすべての新しいホストを手動で追加する必要があります。このフラグが「no」に設定されている場合、ssh は新しいホスト キーをユーザーの既知のホスト ファイルに自動的に追加します。このフラグが「尋ねる」に設定されている場合、ユーザーが本当にやりたいことを確認した後にのみ、新しいホストキーがユーザーの既知のホストファイルに追加され、ssh は

StrictHostKeyCheckingプロンプトを出さずに ssh/scp に新しい鍵を自動的に受け入れさせたい場合は、「no」に設定できます。コマンドラインで:

scp -o StrictHostKeyChecking=no ...

バッチ モードを有効にすることもできます。

バッチモード

「yes」に設定すると、パスフレーズ/パスワードのクエリが無効になります。このオプションは、パスワードを入力するユーザーが存在しないスクリプトやその他のバッチ ジョブで役立ちます。引数は「はい」または「いいえ」でなければなりません。デフォルトは「いいえ」です。

ではBatchMode=yes、プロンプトの代わりに ssh/scp が失敗します (これは多くの場合、スクリプトの改善です)。

于 2012-04-27T20:28:17.523 に答える
1

指紋の一致について尋ねられないようにする最善の方法は、関連するキーを に事前入力すること.ssh/known_hostsです。ほとんどの場合、リモート マシンの公開鍵が何であるかを既に知っているはずであり、それらknown_hostsを ssh が見つけられる .xml に置くのは簡単です。

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

于 2012-04-27T20:29:11.853 に答える