Python远程服务器文件存在性检查返回255,如何排查及实现替代方案?
远程文件存在性检测问题排查及实现方案
原代码返回255的原因
ssh命令的返回码255代表连接本身出现错误,并非
test -e命令的执行结果。常见触发原因如下:
- 未配置远程主机的ssh免密登录,subprocess调用无交互输入密码的通道,直接连接失败
ssh_host地址填写错误、ssh端口非默认22未显式指定、远程主机ssh服务异常- 主机密钥校验不通过、当前用户无远程主机ssh访问权限
原代码本身的逻辑没有问题,只要ssh链路正常,test -e的返回值会被正确捕获:文件存在返回0,不存在返回1,仅ssh连接异常时才会返回255。
原代码修复方案
如果要继续使用subprocess调用ssh的方案,可以调整ssh参数避免交互、明确错误原因:
import subprocess import pipes ssh_host = 'host_address' file_path = 'file_loc' # 增加ssh参数禁用交互、跳过主机密钥校验 resp = subprocess.run( ['ssh', '-o', 'BatchMode=yes', '-o', 'StrictHostKeyChecking=no', ssh_host, 'test -e ' + pipes.quote(file_path)], capture_output=True, text=True ) if resp.returncode == 0: print(f'{file_path} 存在') elif resp.returncode == 1: print(f'{file_path} 不存在') else: # 返回码非0/1时打印ssh错误信息定位问题 print(f'ssh连接出错,错误信息:{resp.stderr}')
基于现有paramiko连接的实现方案
直接复用你已经配置好的paramiko连接即可,不需要额外调用系统ssh进程,稳定性更高,也不会依赖系统ssh环境配置。
方案1:执行远程test命令
# 此处ssh为你已经初始化完成的paramiko.SSHClient实例,无需重复创建连接 stdin, stdout, stderr = ssh.exec_command(f'test -e {file_path}') exit_code = stdout.channel.recv_exit_status() if exit_code == 0: print(f'{file_path} 存在') elif exit_code == 1: print(f'{file_path} 不存在') else: print(f'命令执行出错:{stderr.read().decode()}')
方案2:sftp直接查询文件属性(更安全,无命令注入风险)
sftp = ssh.open_sftp() try: sftp.stat(file_path) print(f'{file_path} 存在') except FileNotFoundError: print(f'{file_path} 不存在') except Exception as e: print(f'查询出错:{str(e)}') finally: sftp.close()
内容的提问来源于stack exchange,提问作者Adi Krish
相关产品推荐
相关产品推荐

