0

我需要使用 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

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

4

2 回答 2

5

系统会提示您将主机密钥添加到已知主机文件,因为 ssh 配置为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_hostsssh 可以找到的位置。

在您不知道并且不能知道远程公钥的少数情况下,最正确的解决方案取决于您不知道的原因。例如,如果您正在编写需要在任意用户机器上运行的软件,并且可能需要代表用户 ssh 到其他任意机器,那么最好让您的软件ssh-keyscan自行运行以获取表面上的远程公共密钥,如果可能的话,让用户明确地批准或拒绝它,如果批准,将密钥附加到 known_hosts然后调用 ssh。

于 2012-04-27T20:29:11.853 回答