如何在Paramiko中配置代理命令?SFTP代理连接报错解决
问题:Paramiko连接SFTP代理时触发FileNotFoundError [WinError 2]
场景
通过SSIS包结合Python脚本自动化SFTP文件上传/下载,计划在SQL Server作业中运行该包,需通过代理服务器连接SFTP。使用Paramiko时出现系统找不到指定文件的错误。
错误信息
Traceback (most recent call last): File "C:\Python\PythON-Wtajemniczenie\LibrisSFTP.py", line 7, in <module> proxy = paramiko.proxy.ProxyCommand( File "C:\Users\arkadiusz.drezek\AppData\Local\Programs\Python\Python310\lib\site-packages\paramiko\proxy.py", line 62, in __init__ self.process = subprocess.Popen( File "C:\Users\arkadiusz.drezek\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 969, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "C:\Users\arkadiusz.drezek\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1438, in _execute_child hp, ht, pid, tid = _winapi.CreateProcess(executable, args, FileNotFoundError: [WinError 2] 系统找不到指定文件
原代码
import paramiko hostname = "my_sftp_host" port=22 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) proxy = paramiko.proxy.ProxyCommand( '/usr/bin/nc --proxy my_server_proxy %s %d' \ % (hostname, port) ) ssh = paramiko.Transport(sock=proxy) ssh.connect(username='***', password='***') sftp = paramiko.SFTPClient.from_transport(ssh)
错误原因
代码中使用的/usr/bin/nc是Linux系统下netcat工具的路径,但运行环境为Windows(从报错路径C:\Users\...可判断),Windows默认没有该可执行文件,导致系统找不到指定程序。
解决方案
方案1:使用Windows版netcat
- 下载Windows版netcat(比如nmap工具集附带的
nc.exe),将其路径添加到系统环境变量PATH中,或直接在代码中指定完整路径。 - 修改ProxyCommand的路径为Windows格式,注意转义反斜杠:
proxy = paramiko.proxy.ProxyCommand( r'C:\path\to\nc.exe --proxy my_server_proxy %s %d' % (hostname, port) )
注意:确保SQL Server作业的运行账户有权限访问该nc.exe文件。
方案2:纯Python实现代理(推荐)
使用pysocks库实现代理,无需依赖外部工具,稳定性更高:
- 安装pysocks库:
pip install pysocks
- 修改代码如下(以SOCKS5代理为例,若为HTTP代理需调整参数):
import paramiko import socks import socket hostname = "my_sftp_host" port = 22 proxy_host = "my_server_proxy" proxy_port = 3128 # 替换为实际代理端口 proxy_username = "" # 若代理需认证,填写用户名 proxy_password = "" # 若代理需认证,填写密码 # 配置SOCK代理 socks.set_default_proxy( socks.SOCKS5, proxy_host, proxy_port, username=proxy_username, password=proxy_password ) socket.socket = socks.socksocket # 建立SFTP连接 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname, port, username='***', password='***') sftp = paramiko.SFTPClient.from_transport(ssh.get_transport())
注意:如果使用HTTP代理,将socks.SOCKS5改为socks.HTTP;确保SQL Server作业使用的Python环境已安装pysocks库。
额外注意事项
- 确认SQL Server作业的代理账户拥有Python脚本及依赖库的访问权限。
- 测试连接时,先在本地手动运行Python脚本验证通过,再部署到SQL Server作业中。
内容的提问来源于stack exchange,提问作者Arkadiusz
相关产品推荐
相关产品推荐

