Python实现SFTP自动化传输:从原理到代码实战
本文深入解析SFTP与FTP的安全差异,重点展示如何使用Python实现SFTP自动化文件传输。通过详解YAML配置文件结构、Flask应用初始化及核心SFTP客户端逻辑,提供从环境搭建到代码运行的完整指南,解决WinSCP脚本兼容性问题,适用于企业级数据同步场景。
前言
本文旨在记录Python在办公自动化中应用SFTP传输的核心内容。
公司内部B2B业务通常依赖WinSCP结合SFTP协议与客户进行数据交互。WinSCP是一款基于Windows环境的开源SSH图形化SFTP客户端。起初尝试复用同事提供的WinSCP脚本代码向总部传输数据,但执行始终失败。由于不确定是WinSCP版本兼容性问题,还是要求两端操作系统均为Windows环境,最终决定查阅相关资料,重新编写Python脚本以解决此问题。
以下为正文详细案例,供参考学习。
SFTP与FTP的核心区别
两者在安全通道、底层协议、连接方式及安全性方面存在显著差异。
- SFTP(SSH File Transfer Protocol)是一种基于网络的安全文件传输协议,旨在通过私有且安全的数据通道传输文件,确保数据传输的安全性。
- FTP(File Transfer Protocol)即文件传输协议,其本身不提供加密通道,主要用于主机间的文件共享。在Web场景中,将文件上传至FTP服务器是共享文件最便捷的方式,用户可通过FTP客户端下载所需文件。
SFTP与FTP的具体差异表现如下:
首先,在安全通道方面,FTP不提供任何加密通道,而SFTP通过SSH协议建立安全通道进行传输。其次,在协议层面,FTP基于TCP/IP协议,使用TCP端口21建立控制连接;SFTP则是SSH协议的一部分,通过TCP端口22建立客户端与服务器间的安全连接。最后,在数据安全性上,FTP以明文形式发送密码和数据,安全性较低;SFTP则在发送前对数据进行加密,以二进制形式传输,无法直接读取原文,因此安全性更高。具体技术细节建议查阅相关网络资料。
具体使用步骤
程序整体结构

配置文件设计
config.yaml配置代码如下:
CONFIG: &config
# 日志配置文件路径
LOGGING_CONFIG_PATH: ./Configs/logging.yaml
# 日志文件存放位置
LOGGING_PATH: ./logs
# SFTP
FTP_HOST: ***.*****.com
FTP_PORT: 22
FTP_USER_NAME : XXXXXXXXX
FTP_PASSWORD : XXXXXXXXX
HOME_DIR : /
REMOTE_PATH : /XXX/
LOCAL_DIR : D:\Web\HR
LOCAL_DESDIR : D:\Web\HR\TMP
# 邮件
SMTP_SERVER : CNMAIL
SMTP_USER_NAME : XXX@163.com
SMTP_USER_PWD : XXX
FROM_MAIL : isadmin@XXX.com
TO_MAIL : XXX.zhang@XXX.com
CC_MAIL : XXX.zhang@XXX.com
DEVELOPMENT : &development
<<: *config # 继承config,没有重新定义的变量,使用config变量值
DEBUG: True
PRODUCTION : &production
<<: *config # 继承config,没有重新定义的变量,使用config变量值
DEBUG: True读取配置文件逻辑
相关代码实现如下:
def create_app(config_name=None, config_path=None):
app = Flask(__name__)
# 读取配置文件
if not config_path:
pwd = os.getcwd()
config_path = os.path.join(pwd, 'Configs/config.yaml')
if not config_name:
config_name = 'PRODUCTION'
conf = read_yaml(config_name, config_path)
app.config.update(conf)
if not os.path.exists(app.config['LOGGING_PATH']):
# 日志文件目录
os.mkdir(app.config['LOGGING_PATH'])
# 日志设置
with open(app.config['LOGGING_CONFIG_PATH'], 'r', encoding='utf-8') as f:
dict_conf = yaml.safe_load(f.read())
logging.config.dictConfig(dict_conf) # 载入日志配置
return appSFTP客户端模块 (sftp_client.py)

邮件通知模块 (email_client.py)

主程序入口 (main.py)

主程序运行代码如下:
if __name__ == "__main__":
remotePath = ""
localPath = ""
runSFTP(remotePath, localPath)总结
至此,关于Python办公自动化中SFTP传输的详细教程已介绍完毕。如需了解更多Python SFTP相关内容,欢迎查阅本站过往文章或继续浏览后续系列教程,感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









