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

如何在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

  1. 下载Windows版netcat(比如nmap工具集附带的nc.exe),将其路径添加到系统环境变量PATH中,或直接在代码中指定完整路径。
  2. 修改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库实现代理,无需依赖外部工具,稳定性更高:

  1. 安装pysocks库:
pip install pysocks
  1. 修改代码如下(以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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:50:33