第二次从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
相关产品推荐
相关产品推荐

