python:使用Popen与shell命令交互

Sha*_*ang 0 python stdin 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
Run Code Online (Sandbox Code Playgroud)

如果我运行该程序,它仍会提示并要求输入。如何自动响应提示?谢谢。

lar*_*sks 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 ...
Run Code Online (Sandbox Code Playgroud)

您还可以启用批处理模式:

批处理模式

如果设置为“是”,密码短语/密码查询将被禁用。此选项在没有用户提供密码的脚本和其他批处理作业中很有用。参数必须为“是”或“否”。默认为“否”。

使用BatchMode=yes,ssh / scp将失败而不是提示(这通常是脚本的改进)。