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

Kubernetes环境下pysftp.Connection报OSError: Int or String expected求助

OSError: Int or String expected 报错排查(pysftp/paramiko连接SFTP在Kubernetes环境)

环境信息

  • Python 3.7.6
  • pysftp 0.2.9
  • paramiko 3.0.0
  • 操作系统:Ubuntu 20.04 LTS (Focal Fossa)
  • 运行环境:IBM Elyra + Kubernetes 上的Jupyter Notebook

报错详情

---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
/usr/local/bin/kernel-launchers/python/scripts/launch_ipykernel.py in <module>
----> 1 sftp_conn = pysftp.Connection(host=sftp_info['host'],port= sftp_info['port'], username= sftp_info['login'], password=sftp_info['password'],cnopts=cnopts)

/opt/conda/lib/python3.7/site-packages/pysftp/__init__.py in __init__(self, host, username, private_key, password, port, private_key_pass, ciphers, log, cnopts, default_path)
    138         # Begin the SSH transport.
    139         self._transport = None
--> 140         self._start_transport(host, port)
    141         self._transport.use_compression(self._cnopts.compression)
    142         self._set_authentication(password, private_key, private_key_pass)

/opt/conda/lib/python3.7/site-packages/pysftp/__init__.py in _start_transport(self, host, port)
    174         '''start the transport and set the ciphers if specified.'''
    175         try:
--> 176             self._transport = paramiko.Transport((host, port))
    177             # Set security ciphers if set
    178             if self._cnopts.ciphers is not None:

/opt/conda/lib/python3.7/site-packages/paramiko/transport.py in __init__(self, sock, default_window_size, default_max_packet_size, gss_kex, gss_deleg_creds, disabled_algorithms, server_sig_algs)
    428             reason = "No suitable address family"
    429             addrinfos = socket.getaddrinfo(
--> 430                 hostname, port, socket.AF_UNSPEC, socket.SOCK_STREAM
    431             )
    432             for family, socktype, proto, canonname, sockaddr in addrinfos:

/opt/conda/lib/python3.7/socket.py in getaddrinfo(host, port, family, type, proto, flags)
    750     # and socket type values to enum constants.
    751     addrlist = []
--> 752     for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
    753         af, socktype, proto, canonname, sa = res
    754         addrlist.append((_intenum_converter(af, AddressFamily),

OSError: Int or String expected

实现代码

import pysftp

cnopts = pysftp.CnOpts(knownhosts=None)
# cnopts.hostkeys = None
key = pysftp.RSAKey(data=decodebytes(keydata))


cnopts.hostkeys.add(sftp_info["host"], "ssh-rsa", key)

sfc = pysftp.Connection(
    host=sftp_info["host"],
    port=sftp_info["port"],
    username=sftp_info["login"],
    password=sftp_info["password"],
    cnopts=cnopts,
)

sfc.listdir()

额外警告

/opt/conda/lib/python3.7/site-packages/pysftp/__init__.py:61: UserWarning: Failed to load HostKeys from /home/jovyan/.ssh/known_hosts.  You will need to explicitly load HostKeys (cnopts.hostkeys.load(filename)) or disableHostKey checking (cnopts.hostkeys = None).
  warnings.warn(wmsg, UserWarning)

本地测试对比

本地Docker环境(基于Python:3.7.6镜像,Debian 10 (buster))复刻相同依赖版本,代码可正常运行,即使删除~/.ssh/known_hosts也能成功连接并返回目录列表:

>>> sfc.listdir()
['data', 'fire']

直接使用paramiko连接也出现完全相同的错误,目前无法定位问题。

排查方向与解决方案

  1. 检查sftp_info中port字段的类型
    错误提示"Int or String expected",大概率是port参数类型异常。Kubernetes环境中,配置值可能被解析为非字符串/整数类型(比如None、布尔值或者其他对象)。在创建连接前强制转换port类型:

    # 确保port是整数或字符串
    port = int(sftp_info["port"]) if isinstance(sftp_info["port"], str) else sftp_info["port"]
    sfc = pysftp.Connection(
        host=sftp_info["host"],
        port=port,
        username=sftp_info["login"],
        password=sftp_info["password"],
        cnopts=cnopts,
    )
    
  2. 验证sftp_info中host字段的有效性
    确认sftp_info["host"]是合法的字符串格式(域名或IP),没有出现空值、None或者特殊字符。可以在代码中添加打印:

    print(f"Host: {sftp_info['host']}, Type: {type(sftp_info['host'])}")
    print(f"Port: {sftp_info['port']}, Type: {type(sftp_info['port'])}")
    
  3. 降级paramiko版本
    pysftp 0.2.9是比较旧的版本,而paramiko 3.0.0有较大的API变更,两者兼容性可能存在问题。尝试降级paramiko到2.x版本:

    pip install paramiko==2.12.0
    
  4. 检查Kubernetes环境的DNS解析
    虽然错误提示是参数类型,但也有可能是K8s环境中DNS解析异常导致host字段处理出错。可以在Notebook中执行ping命令验证SFTP服务器的可达性:

    import subprocess
    subprocess.run(["ping", "-c", "3", sftp_info["host"]])
    

内容的提问来源于stack exchange,提问作者arundeep78

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:00:58