通过SSIS执行包从SFTP拉取文件时连接失败报错求助
错误信息
执行用户为/。回溯(最近的调用先发生):文件"E:/file//import_file_.py"第18行,在
with pysftp.Connection(host=myHostname, username=myUsername, password=myPassword, cnopts=cnopts) as sftp:处抛出异常;调用链最终指向paramiko.ssh_exception.SSHException:无法连接sftp.site.com: [WinError 10060] 连接尝试失败,因为连接方在一段时间后未正确响应,或已建立的连接失败,因为连接的主机未能响应。
Microsoft (R) SQL Server Execute Package Utility 版本15.0.4312.2(64位),版权所有(C)2019 Microsoft。保留所有权利。开始时间:14:42:00
错误:2023-07-31 14:42:43.27,代码:0xC0029151,来源:Execute Process Task Execute Process Task,描述:执行"C:\Users\tt\AppData\Local\Programs\Python\Python311\python.exe" "E:/file//import_file_.py "于"E:\tt\file\data"时,进程退出码为"1",预期为"0"。
结束错误。DTExec:包执行返回DTSER_FAILURE(1)。开始时间:14:42:00,结束时间:14:42:43,耗时:42.828秒。包执行失败,步骤失败。
执行代码
from msilib.schema import Directory import pysftp import os import glob import fnmatch from datetime import date, timedelta #assuming that I have a connection to the SFTP server cnopts = pysftp.CnOpts() cnopts.hostkeys = None myHostname = 'sftp.mm.com' myUsername = 'name' myPassword = '**' with pysftp.Connection(host=myHostname, username=myUsername, password=myPassword, cnopts=cnopts) as sftp: print("Connection Success") remotefilepath='/data.zip/' localfilepath= r'E:\\data.zip' sftp.get(remotefilepath,localfilepath) print("File transfer Success")
排查与解决建议
- 网络连通性验证
- 在SQL Server Agent所在服务器执行
ping sftp.mm.com,确认域名解析正常、网络链路可达;若ping不通,排查DNS配置或服务器网络出口限制。 - 执行
telnet sftp.mm.com 22(SFTP默认端口),检查端口是否开放;若连接失败,排查本地服务器防火墙、网络防火墙或SFTP服务器端防火墙规则。
- 在SQL Server Agent所在服务器执行
- Agent服务权限调整
SQL Server Agent默认使用系统账户运行,该账户可能无外部网络访问权限,或无法读取Python环境依赖文件。将Agent服务切换至具备网络访问权限的本地账户/域账户,并确保该账户可访问Python安装路径及脚本文件。 - 代码配置修正
- 修正远程文件路径:
remotefilepath='/data.zip/'末尾多余斜杠,改为remotefilepath='/data.zip'(SFTP指向文件时不应加结尾斜杠)。 - 核对域名一致性:错误信息中显示连接
sftp.site.com,但代码中配置的是sftp.mm.com,确认后修正域名。 - 恢复主机密钥验证:移除
cnopts.hostkeys = None,提前将SFTP服务器主机密钥添加至服务器的known_hosts文件,避免安全风险。
- 修正远程文件路径:
- 本地脚本测试
在服务器上直接运行python "E:/file//import_file_.py",若本地执行正常但Agent运行失败,重点排查Agent运行账户的权限差异、环境变量配置(如Python路径)。
内容的提问来源于stack exchange,提问作者MSM

