如何用Python在不下载到本地的情况下将数据从一台服务器传输到另一台服务器?

0 投票
1 回答
2128 浏览
提问于 2025-04-17 19:57

我正在使用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。

撰写回答