簡體   English   中英

python:使用Popen與shell命令交互

[英]python: interact with shell command using Popen

我需要使用python執行幾個shell命令,但無法解決其中一個問題。 當我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

如果我運行該程序,它仍會提示並要求輸入。 如何自動響應提示? 謝謝。

由於將ssh配置為StrictHostKeyChecking因此系統會提示您將主機密鑰添加到已知主機文件中。 從手冊頁:

StrictHostKeyChecking

如果將此標志設置為“ yes”,則ssh(1)將永遠不會自動將主機密鑰添加到〜/ .ssh / known_hosts文件,並且拒絕連接主機密鑰已更改的主機。 盡管當/ etc / ssh / ssh_known_hosts文件維護不當或經常與新主機建立連接時,這可能會很煩人,但它可以最大程度地防止特洛伊木馬攻擊。 此選項強制用戶手動添加所有新主機。 如果此標志設置為“ no”,則ssh會自動將新的主機密鑰添加到用戶已知的主機文件中。 如果此標志設置為“詢問”,則只有在用戶確認他們確實要執行的操作之后,新的主機密鑰才會添加到用戶已知的主機文件中。

如果希望ssh / scp在沒有提示的情況下自動接受新密鑰,則可以將StrictHostKeyChecking設置為“ no”。 在命令行上:

scp -o StrictHostKeyChecking=no ...

您還可以啟用批處理模式:

批處理模式

如果設置為“是”,密碼短語/密碼查詢將被禁用。 此選項在沒有用戶提供密碼的腳本和其他批處理作業中很有用。 參數必須為“是”或“否”。 默認為“否”。

使用BatchMode=yes ,ssh / scp將失敗而不是提示(這通常是腳本的改進)。

我知道避免被問及指紋匹配的最好方法是在.ssh/known_hosts預先填充相關密鑰。 在大多數情況下,您確實應該已經知道遠程計算機的公共密鑰是什么,將它們放在ssh可以找到的known_hosts中很簡單。

在少數情況下,您也不知道遠程公鑰,那么最正確的解決方案取決於您為什么不知道。 例如,如果您編寫的軟件需要在任意用戶盒上運行,並且可能需要代表用戶ssh到其他任意盒,那么最好是自己運行軟件ssh-keyscan來獲取軟件。表面上的遠程公共密鑰,如果可能的話,讓用戶明確批准或拒絕它,如果批准,則將該密鑰附加到known_hosts, 然后調用ssh。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM