Python 中两个远程服务器之间的 scp

scp between two remote servers in Python

我正在尝试使用 Paramiko 连接远程服务器并将一些文件发送到其他远程服务器。我尝试了下面的代码,但没有用。我检查了所有连接、用户名和密码参数,它们没有任何问题。我要传输的文件也存在于第一个远程服务器的正确路径中。

我之所以不把文件下载到本地电脑,而是上传到第二台服务器,是因为两台远程服务器之间的连接速度要快很多。

我尝试过的事情:

import paramiko
s = paramiko.SSHClient()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
s.connect("10.10.10.10", 22, username='oracle', password='oracle', timeout=4)

stdin, stdout, stderr = s.exec_command(
        "scp /home/oracle/myFile.txt oracle@10.10.10.20:/home/oracle/myFile.txt")

stdin.write('password\n')
stdin.flush()
s.close()

您不能将密码写入 OpenSSH 的标准输入 scp

在 shell 中尝试,它也不行:

echo password | scp /home/oracle/myFile.txt oracle@10.10.10.20:/home/oracle/myFile.txt

OpenSSH 工具(包括scp)只能从终端读取密码。

您可以通过设置 SSHClient.exec_commandget_pty 参数来模拟终端:

stdin, stdout, stderr = s.exec_command("scp ...", get_pty=True)
stdin.write('password\n')
stdin.flush()

尽管启用终端仿真会给您带来不必要的副作用。

更好的解决方案是使用 public 密钥身份验证。还有其他解决方法。请参阅 How to pass password to scp?(尽管他们在内部必须做类似于 get_pty=True 的事情)。


其他问题:

  • 您必须等待命令完成。调用 s.close() 可能会终止传输。大多数情况下使用 stdout.readlines() 即可。但它可能会挂起,参见 .
  • 不要使用 AutoAddPolicy – 您正在失去针对 MITM attacks by doing so. For a correct solution, see Paramiko "Unknown Server" 的保护。