• 仅20行代码,实现文件自动化上传至sftp

仅20行代码,实现文件自动化上传至sftp

2025-04-27 11:13:13 栏目:宝塔面板 62 阅读

1. 背景

最近接到一个产品需求是给指定的 sftp 服务器的指定目录定时推送文件数据。

因为项目组已有现成的组件可以轻松实现 sftp 服务器文件的快速上传,本来是一件很容易的事情,但是问题出现在这个指定的 sftp 服务器所指定的密码带有系统关键字和一些特殊字符,导致现在的组件在解析过程中会失败。

因此重新开发了下面的这套脚本来满足这个特殊的需求。

2. 代码实现

Python代码

#test_upload.py
import os, sys
import yaml
from optparse import OptionParser
import paramiko
import traceback


opt_parser = OptionParser()
opt_parser.add_option('--node', action='store', type='string', dest='node', help='sftp config')
opt_parser.add_option('--local_file', action='store', type='string', dest='local_file', help='file to be transferred')


def load_config_from_param_conf(key):
"""
:param key: 指定业务所使用的sftp服务的名称,例如sftp.yaml文件中的key: test_file_upload
:return: 从指定路径拿到yaml文件并读取指定key,返回例如sftp.yaml文件中key为test_file_upload下的配置选项值
包含: host,port,user,password,destination
"""
config_file = f'{os.environ["TASK_MAIN"]}/test_conf/sftp.yaml' #获取指定路径下的yaml文件
with open(config_file, 'r') as r: #打开yaml文件内容
config = yaml.load(r) #转换yaml数据为字典
return config['sftp']['upload'][key]


def upload(sftp_conf, local_file_path):
"""
:param sftp_conf: 获取指定sftp_conf=test_file_upload下返回的字典值,这里的参数sftp_conf与load_config_from_param_conf函数里的参数值一致
:param local_file_path: 指定本地要上传到sftp服务器的文件的绝对路径
:return:
"""
sf = paramiko.Transport((sftp_conf['host'], sftp_conf['port']))
sf.connect(username=sftp_conf['user'], password=sftp_conf['password'])
sftp = paramiko.SFTPClient.from_transport(sf)
to_path = sftp_conf['destination']
sftp.put(local_file_path, to_path + os.sep + os.path.split(local_file_path)[-1], confirm=False)
sftp.close()


if __name__ == '__main__':
option = opt_parser.parse_args(sys.argv[1:])[0]
sftp_conf = load_config_from_param_conf(option.node)
try:
upload(sftp_conf, option.local_file)
except Exception as e:
print(traceback.format_exc())
raise Exception('upload {} file error.'.format(option.local_file))

sftp配置文件代码

#sftp.yaml
sftp:
upload:
test_file_upload:
host: 10.12.34.6
port: 808
user: user_test
password: 8Z.Lx/2@UH
destination: /data/dump

3. 代码分析

(1). yaml 模块

import yaml

导入 yaml 模块前可以使用以下命令进行模块的安装

python3 -m pip install PyYaml

yaml 模块在这里的作用是读取 sftp 配置文件代码,将指定key: test_file_upload 下的 key:value 的值转换为字典。

例如:load_config_from_param_conf 函数中的返回值就是使用 yaml 读取到 sftp 配置文件代码后,返回 key: test_file_upload 下配置选项值。

格式如下:

{ "host": "10.12.34.6",
"port": "808",
"user": "user_test",
"password": "8Z.Lx/2@UH",
"destination": "/data/dump"
}

最后将返回值传给 upload 函数作为参数。

(2). OptionParser 模块

from optparse import OptionParser

按照 yaml 模块的安装方法,先安装 optparse 模块后,然后在文件中从optparse 中导入 OptionParser 模块

opt_parser = OptionParser()
opt_parser.add_option('--node', action='store', type='string', dest='node', help='sftp config')
opt_parser.add_option('--local_file', action='store', type='string', dest='local_file', help='file to be uploaded')

在这里我使用了 OptionParser 这个类实例化了一个对象:opt_parser,通过对象来调用 add_option 方法添加了2个参数,分别是:node, local_file

1). 形参:--node,实参:node

所代表的业务含义是:指定要上传的 sftp 的节点,具体参数值对应 sftp配置文件代码中的 test_file_upload

2). 形参:--local_file,实参:local_file

所代表的业务含义是:指定本地需要被上传到 sftp 服务器的具体文件路径

3). 调用命令

python3 test_upload.py --node test_file_upload --local_file 
/home/test/sftp_load/test_001.csv

4). add_option()方法

add_option()参数说明:

  • action: 存储方式,分别为:store,store_false,store_true
  • type: 类型
  • dest: 存储的变量
  • default: 默认值
  • help: 帮助信息

参数:action的枚举

  • store: 参数列表中带有--node, 那么就会将下一个元素即:test_file_upload 作为其 dest 实参 node 的值; 如果没有--node,那么对应的node的值就为 None;
  • store_true: 参数列表中有--local_file, 那么其 dest 实参 local_file 的值就为 True; 否者就为 default 定义的默认值,这里没有给定 default 的默认值;
  • store_false: 参数列表中有--local_file, 那么其 dest 实参 local_file 的值就为 False; 否者就为 default 定义的默认值,这里没有给定 default 的默认值;

参数:type

type是指定传入参数的类型,这里的参数类型为 string 类型。

参数:dest

dest是参数传入后由哪个变量来存储的,后面代码对该参数的引用也是使用这里定义的变量名来引用的。

参数:default

default 是与 action 的值结合使用的。

  • 当action=store_true时,default=123时,如果有传入形参--local_file,则实参local_file的值为:True
  • 当action=store_true时,default=123时,如果没有传入形参--local_file,则实参local_file的值为:123
  • 当action=store_false时,default=123时,如果有传入形参--local_file,则实参local_file的值为:False
  • 当action=store_false时,default=123时,如果没有传入形参--local_file,则实参local_file的值为:123

参数:help

help相当于帮助说明文档,用于描述这个参数的含义。

本文地址:https://www.yitenyun.com/159.html

搜索文章

Tags

数据库 API FastAPI Calcite 电商系统 MySQL 数据同步 ACK Web 应用 异步数据库 双主架构 循环复制 Deepseek 宝塔面板 Linux宝塔 Docker 生命周期 序列 核心机制 JumpServer JumpServer安装 堡垒机安装 Linux安装JumpServer esxi esxi6 root密码不对 无法登录 web无法登录 Windows Windows server net3.5 .NET 安装出错 宝塔面板打不开 宝塔面板无法访问 SSL 堡垒机 跳板机 HTTPS 查看硬件 Linux查看硬件 Linux查看CPU Linux查看内存 无法访问宝塔面板 Windows宝塔 Mysql重置密码 HTTPS加密 连接控制 机制 ES 协同 Oracle 处理机制 Serverless 无服务器 语言 OB 单机版 Spring SQL 动态查询 scp Linux的scp怎么用 scp上传 scp下载 scp命令 技术 存储 运维 索引 缓存方案 缓存架构 缓存穿透 分页查询 Rsync 架构 InnoDB 日志文件 MIXED 3 响应模型 修改DNS Centos7如何修改DNS RocketMQ 长轮询 配置 监控 HexHub Redis 电商 系统 Linux 安全 服务器 聚簇 非聚簇 MySQL 9.3 异步化 防火墙 黑客 sftp 服务器 参数 数据 主库 group by 自定义序列化 查询 SQLark PostgreSQL 开源 存储引擎 管理口 业务 数据库锁 SQLite-Web SQLite 数据库管理工具 R edis 线程 线上 库存 预扣 人工智能 向量数据库 推荐系统 Doris SeaTunnel MVCC 加密 场景 流量 工具 共享锁 PG DBA ​Redis 机器学习 推荐模型 数据备份 信息化 智能运维 网络架构 网络配置 Ftp redo log 重做日志 高可用 Canal B+Tree ID 字段 • 索引 • 数据库 RDB AOF Redis 8.0 AI 助手 GreatSQL 连接数 Postgres OTel Iceberg Python 优化 万能公式 缓存 核心架构 订阅机制 同城 双活 网络故障 INSERT COMPACT Hash 字段 自动重启 Web 云原生 微软 SQL Server AI功能 prometheus Alert 不宕机 IT运维 大模型 引擎 性能 分库 分表 SVM Embedding 高效统计 今天这篇文章就跟大家 虚拟服务器 虚拟机 内存 向量库 Milvus OAuth2 Token Netstat Linux 服务器 端口 单点故障 Entity 开发 ZODB DBMS 管理系统 MongoDB 容器 sqlmock LRU 崖山 新版本 Undo Log 容器化 窗口 函数 mini-redis INCR指令 JOIN openHalo 数据集成工具 SpringAI 分布式 集中式 悲观锁 乐观锁 磁盘架构 排行榜 排序 Redka 数据脱敏 加密算法 Redisson 锁芯 PostGIS QPS 高并发 Testcloud 云端自动化 EasyExcel MySQL8 Recursive 数据类型 模型 启动故障 大表 业务场景 StarRocks 数据仓库 分页 数据结构 意向锁 记录锁 分布式架构 分布式锁​ Pottery 聚簇索引 非聚簇索引 原子性 AIOPS R2DBC Caffeine CP IT MCP 开放协议 网络 InfluxDB 1 工具链 事务 Java SSH Web 接口 dbt 数据转换工具 部署 RAG HelixDB 发件箱模式 池化技术 连接池 数据分类 filelock 速度 服务器中毒 事务隔离 字典 传统数据库 向量化 对象 读写 Go 数据库迁移 仪表盘 单线程 双引擎 频繁 Codis 分页方案 排版 数据页 优化器 线程安全 Order LLM Crash 代码 List 类型 事务同步 UUIDv7 主键 订单 日志 Pump Ansible