如何用Python在不下载到本地的情况下将数据从一台服务器传输到另一台服务器?
我正在使用Paramiko这个工具,把一些图片下载到本地电脑,然后再通过SSH上传到服务器。
我想知道有没有办法直接上传到服务器,而不需要先下载到本地?因为在下载和上传大文件(超过100MB)时,服务器会超时。
我想要的功能类似于这个链接里的内容: https://unix.stackexchange.com/questions/9029/how-to-wget-a-file-to-a-remote-machine-over-ssh
不过我希望用Python来实现。
1 个回答
1
假设你有这样的网络结构:
local machine ---X--- machine A
| |
| Z
| |
---Y---- machine B
那么你现在是通过链接 X
下载数据,然后通过链接 Y
上传数据。如果 机器 A
可以直接和 机器 B
通信,那么链接 Z
也是存在的。这种情况通常是 机器 A
和 机器 B
都可以被外部访问。
所以你想让 机器 A
直接把图片传输到 机器 B
。在这个过程中,实际上是运行在 机器 A
或 机器 B
上的代码在处理这个传输,所以用 Python 解决方案可能只会帮你启动这个传输。
如果你是在 bash 命令行中使用 ssh
,你可能会输入类似这样的命令:
ssh user@machineA 'scp myfile user@machineB'
这假设你可以通过 shell 访问 机器 A
上的 ssh 服务器,并且它安装了 scp
程序。Paramiko 主要是用来连接到 机器 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')
更新:
如果图片是从 机器 A
提供的,但你没有 ssh 登录权限,那么你可以直接登录到 机器 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')
为了测试,直接使用 ssh/wget,而跳过 paramiko。