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

第二次从Paramiko SSH客户端读取标准输出失败问题排查

问题原因

你在第二次执行的Docker命令里用了-f(follow)参数——这个参数的作用是持续跟踪容器的新日志输出,不会自动终止命令。而paramiko的stdout.read()方法会一直等待命令执行完成、输出流关闭后才会返回结果,所以程序会一直卡在读取日志的步骤,永远无法获取到返回值。

解决方案

根据你的实际需求,有两种处理方式:

  • 若仅需获取指定时间范围内的历史日志,不需要实时跟踪,直接去掉-f参数即可:
    ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(f'sudo docker logs {container_id} --since 4m')
    container_logs = ssh_stdout.read()
    
  • 若确实需要实时跟踪日志(保留-f),不能用read()一次性读取,而是要循环读取输出流的内容,还可以按需添加终止条件:
    ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(f'sudo docker logs -f {container_id} --since 4m')
    # 循环读取每一行日志,直到输出流结束或手动终止
    for line in iter(ssh_stdout.readline, ""):
        processed_line = line.strip()
        print(processed_line)
        # 示例:读取到包含特定关键词的日志后停止跟踪
        if "critical error" in processed_line:
            break
    

另外补充:你第一次执行sudo docker ps成功,说明当前用户已配置免密sudo或SSH环境已处理sudo权限,这部分无需额外调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:45:47