如何通过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
相关产品推荐
相关产品推荐

