Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中两个远程服务器之间的scp_Python_Paramiko_Scp - Fatal编程技术网

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

Python中两个远程服务器之间的scp,python,paramiko,scp,Python,Paramiko,Scp,我正在尝试使用Paramiko连接远程服务器,并将一些文件发送到其他远程服务器。我尝试了下面的代码,但没有成功。我检查了所有连接、用户名和密码参数,它们没有任何问题。我要传输的文件也存在于第一个远程服务器的正确路径中 我不将文件下载到本地计算机并上传到第二台服务器的原因是,两台远程服务器之间的连接速度要快得多 我尝试过的事情: 我将paramiko日志级别设置为debug,但找不到任何有用的信息 我从命令行尝试了相同的scp命令从第一台服务器到第二台服务器,效果很好 我试图在stdin.f

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

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

我尝试过的事情:

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

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

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


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

在外壳中尝试,也不会起作用:

echo密码| scp/home/oracle/myFile.txtoracle@10.10.10.20:/home/oracle/myFile.txt
OpenSSH工具(包括
scp
)仅从终端读取密码

您可以通过设置以下参数来模拟终端:

尽管启用终端仿真可能会带来不必要的副作用

更好的解决方案是使用公钥身份验证。还有其他解决办法。请参阅(尽管他们内部必须执行类似于
get_pty=True
的操作)


其他问题:

  • 您必须等待命令完成。调用
    s.close()
    可能会终止传输。在大多数情况下,使用stdout.readlines()即可。但它可能会挂起来,看吧
  • 不要使用
    AutoAddPolicy
    –这样做会使您失去保护。有关正确的解决方案,请参阅
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()
stdin, stdout, stderr = s.exec_command("scp ...", get_pty=True)
stdin.write('password\n')
stdin.flush()