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连接也出现完全相同的错误,目前无法定位问题。
排查方向与解决方案
检查
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, )验证
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'])}")降级paramiko版本
pysftp 0.2.9是比较旧的版本,而paramiko 3.0.0有较大的API变更,两者兼容性可能存在问题。尝试降级paramiko到2.x版本:pip install paramiko==2.12.0检查Kubernetes环境的DNS解析
虽然错误提示是参数类型,但也有可能是K8s环境中DNS解析异常导致host字段处理出错。可以在Notebook中执行ping命令验证SFTP服务器的可达性:import subprocess subprocess.run(["ping", "-c", "3", sftp_info["host"]])
内容的提问来源于stack exchange,提问作者arundeep78
相关产品推荐
相关产品推荐

