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

如何用Python paramiko将qnttest.txt对应文件逐行分发至ip.txt所列各FTP

代码问题诊断
  • 存在多层嵌套循环,导致每连接一个FTP就会遍历所有待发送文件,自然所有文件都发到同一个FTP
  • 重复读取ip.txt、qnttest.txt等文件,既浪费性能也容易出现变量覆盖问题
  • 错误将IP地址的长度值作为本地文件路径传入put方法,逻辑完全错位
  • 变量命名重复(多次复用linha、arquivo作为变量名),可读性极低容易出错
修正后的实现代码
import paramiko

# 预读取所有IP和待分发文件路径,一次性处理完成
with open('ip.txt', 'r', encoding='utf-8') as f:
    ip_list = [line.strip() for line in f if line.strip()]

with open('qnttest.txt', 'r', encoding='utf-8') as f:
    file_list = [line.strip() for line in f if line.strip()]

# 校验两个列表长度一致,避免分发错位
if len(ip_list) != len(file_list):
    print(f"错误:IP数量({len(ip_list)})和待分发文件数量({len(file_list)})不匹配,无法完成一一对应分发")
    exit(1)

# 按索引一一配对分发,第n个文件发给第n个IP
for ip, local_file in zip(ip_list, file_list):
    print(f"开始处理服务器 {ip},待发送文件:{local_file}")
    try:
        # 建立SSH连接
        ssh_client = paramiko.SSHClient()
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh_client.connect(hostname=ip, username='root', password='Server123@')
        ftp_client = ssh_client.open_sftp()

        # 发送对应文件到目标服务器
        ftp_client.put(local_file, '/root/test.txt')
        
        # 如果你需要给每个服务器都发送这三个固定文件,保留下面三行,不需要就删除
        ftp_client.put('test.html', '/root/test.html')
        ftp_client.put('test.pl', '/root/test.pl')
        ftp_client.put('test.txt', '/root/test.txt')

        # 关闭连接
        ftp_client.close()
        ssh_client.close()
        print(f"服务器 {ip} 文件发送成功")
    except Exception as e:
        print(f"服务器 {ip} 处理失败,错误信息:{str(e)}")
关键调整说明
  • 提前一次性读取两个配置文件的内容到列表,避免重复IO操作
  • 用zip()函数直接按索引配对IP和对应文件,天然满足「第1个文件发第1个FTP、第2个发第2个」的需求
  • 去掉了多余的嵌套循环,每个FTP仅处理自己对应的1个文件
  • 增加了长度校验和异常捕获,避免程序无响应或者错位分发
  • 用上下文管理器(with语句)读取文件,自动关闭文件句柄

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:15:00