【问题标题】:scp between two remote servers in PythonPython中两个远程服务器之间的scp
【发布时间】:2021-03-10 21:02:47
【问题描述】:

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

我不将文件下载到本地计算机并上传到第二台服务器的原因是,两个远程服务器之间的连接速度要快得多。

我尝试过的事情:

  • 我将 paramiko 日志级别设置为调试,但找不到任何有用的信息。

  • 我尝试了相同的scp 命令,从命令行从第一台服务器到第二台服务器,效果很好。

  • 我尝试在stdin.flush() 行之后通过data = stdout.readlines() 登录,但没有记录任何内容。

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()

【问题讨论】:

    标签: python paramiko scp


    【解决方案1】:

    您不能将密码写入 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()
    

    虽然启用终端仿真可能会给您带来不必要的副作用。

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


    其他问题:

    【讨论】:

      最近更新 更多