如何使用Python将数据从一台服务器传输到另一台服务器而无需下载到本地?

时间:2013-03-22 03:41:52

标签: python ssh sftp paramiko

我正在使用Paramiko将一些图像下载到localhost,然后通过SSH将它们上传到服务器。

如何在不下载到本地的情况下实现它?由于服务器在下载和上载大文件(> 100 mb)时超时。

类似的东西:  https://unix.stackexchange.com/questions/9029/how-to-wget-a-file-to-a-remote-machine-over-ssh

但是在Python中。

1 个答案:

答案 0 :(得分:1)

假设你有这样的网络结构:

local machine ---X--- machine A
              |            |
              |            Z
              |            |
              ---Y---- machine B

然后您正在通过链接X下载,然后通过链接Y上传。如果machine A可以直接与machine B对话,则链接Z也会存在。如果machine Amachine B都可以公开访问,就会出现这种情况。

因此,您希望machine A启动将图片直接转移到machine B。此时,正在machine A/B上运行的代码处理传输,因此Python解决方案可能只会帮助您开始传输。

如果您是使用ssh从bash shell执行此操作,则可以键入以下内容:

ssh user@machineA 'scp myfile user@machineB'

这假设您对machine A上的ssh服务器具有shell访问权限并且已安装scp程序。 Paramiko仅用于连接machine A以启动传输,而不是用于处理传输本身。

这样的事可能有用:

ssh = paramiko.SSHClient()
ssh.connect('machineA', username='user', password='passwd')
stdin, stdout, stderr = ssh.exec_command("scp '{imgpath}' user@machineB".format(
    imgpath='path/to/file/on/machineA')

<强>更新

如果图像是从machine A提供的,但您没有ssh登录访问权限,则可以通过登录machine B并执行命令将图像直接提取到machine B获取图像。 wget通常可用于此目的。因此,localhost执行此操作的代码可能是:

ssh = paramiko.SSHClient()
ssh.connect('machineB', username='user', password='passwd')
stdin, stdout, stderr = ssh.exec_command("wget '{imgurl}'".format(
    imgurl='http://url.to.image/file')

为了测试,只需跳过使用paramiko并直接使用ssh / wget。