You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Paramiko在远程Server2上执行ftplib连接Server3的代码

实现从Server1经Server2到Server3的FTP传输流程

你的代码无法运行的核心问题是:exec_command是让Server2执行shell命令,但你传入的是Python代码片段,Server2的shell根本无法识别执行这些Python语句。下面提供三种可行的实现方案:

方案1:用Server2的系统FTP客户端完成上传

如果Server2安装了标准ftp客户端,可以先把文件传到Server2临时目录,再用shell命令完成FTP上传:

import paramiko

# 连接Server2
client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect("server2地址", username="server2用户名", password="server2密码")

# 1. 将本地aa.png上传到Server2临时目录
sftp = client.open_sftp()
sftp.put("aa.png", "/tmp/aa.png")
sftp.close()

# 2. 在Server2上执行ftp命令上传到Server3
ftp_cmd = """
ftp -inv server3地址 << EOF
user server3用户名 server3密码
binary
cd xx/yy
put /tmp/aa.png aa.png
bye
EOF
"""
stdin, stdout, stderr = client.exec_command(ftp_cmd)

# 查看执行结果
print(stdout.read().decode())
print(stderr.read().decode())

client.close()

方案2:通过SSH隧道本地直连Server3(无需临时文件)

建立SSH隧道把Server3的FTP端口转发到本地,直接在本地用ftplib完成上传:

import paramiko
import ftplib

# 连接Server2并创建端口转发隧道
client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect("server2地址", username="server2用户名", password="server2密码")

# 把Server3的21端口转发到本地10021端口
transport = client.get_transport()
local_port = 10021
remote_host = "server3地址"
remote_port = 21
transport.open_channel('direct-tcpip', (remote_host, remote_port), ('localhost', local_port))

# 通过本地端口连接Server3的FTP服务
ftp_server = ftplib.FTP()
ftp_server.connect("localhost", local_port)
ftp_server.login("server3用户名", "server3密码")
ftp_server.encoding = "utf-8"
ftp_server.cwd("xx/yy")

with open("aa.png", "rb") as file:
    ftp_server.storbinary(f"STOR aa.png", file)

ftp_server.quit()
client.close()

方案3:在Server2上执行Python脚本(需Server2有Python环境)

如果Server2安装了Python和ftplib,可把上传逻辑写成脚本传到Server2执行:

import paramiko

# 连接Server2
client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect("server2地址", username="server2用户名", password="server2密码")

# 编写并上传Python脚本到Server2
script_content = """
import ftplib

ftp_server = ftplib.FTP("server3地址", "server3用户名", "server3密码")
ftp_server.encoding = "utf-8"
ftp_server.cwd("xx/yy")
with open("aa.png", "rb") as file:
    ftp_server.storbinary(f"STOR aa.png", file)
ftp_server.quit()
"""

sftp = client.open_sftp()
with sftp.file("/tmp/upload_ftp.py", "w") as f:
    f.write(script_content)
# 同时上传aa.png到Server2
sftp.put("aa.png", "/tmp/aa.png")
sftp.close()

# 执行脚本并查看结果
stdin, stdout, stderr = client.exec_command("python3 /tmp/upload_ftp.py")
print(stdout.read().decode())
print(stderr.read().decode())

# 清理临时文件
client.exec_command("rm /tmp/upload_ftp.py /tmp/aa.png")
client.close()

内容的提问来源于stack exchange,提问作者Aristocrat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 16:05:33