python - Python 的 Subprocess 输入管道在特定机器上不断中断
问题描述
我编写了一个脚本,它使用 subprocess 模块通过 sshpadd 访问远程服务并收集一些信息,这些信息在我的本地机器和几个虚拟机上运行良好,但在我将部署它的机器上,作为输入PIPE 不断破裂(写入失败:Broken Pipe)
起初我认为错误与 sshpass 和 ssh 连接有关,我尝试更改我的 ssh_config 以包含 KeepAlive 部分以确保连接永远不会关闭(无论如何都不应该是这种情况,因为我的脚本不需要那么长时间要运行,只需访问远程房屋,运行几个命令并记录输出)。
我认为问题出在子进程模块和输入管道上,当将 subprocess.Popen 与另一个模块一起使用时,它在我使用通信功能时有效,但在我使用输入管道并尝试用户的同一部分我得到了同样write()
的flush()
“断管”错误。
我不确定下一步该怎么做,特别是因为这个错误只发生在我(具有讽刺意味地)最终必须部署脚本的虚拟机上。我尝试过的所有其他虚拟机和我的本地机器都可以毫无问题地运行脚本。
sshpass = ['sshpass', '-p', 'password', 'ssh', '-tt', '-o' , 'StrictHostKeyChecking=no', '-o', 'ConnectTimeout=5', '-o', 'UserKnownHostsFile=/dev/null', 'root@host']
ssh_process = subprocess.Popen(sshpass, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
ssh_process.stdin.write(b'\n\)
ssh.stdin.flush()
知道这里可能有什么问题吗?我完全排除了 ssh 配置,因为我从代码正在运行并且运行良好的机器复制了相同的配置,还有什么可能导致这种情况?
解决方案
推荐阅读
- c# - xUnit 用假的替换第三方类实例
- c# - 复杂的泛型需要一些奇怪的铸件才能运行
- python - python:指定模拟模块属性的返回值
- python-2.7 - 在 Python 中将纬度、经度和高度转换为本地 ENU 坐标
- c# - System.Net.Http.HttpClient 禁用缓存(.Net 标准项目)
- java - 在 JUnit 测试期间禁用部分 Java 程序
- python - 为什么即使没有相同的变量和函数名称也会出现类型错误?
- docker - docker COPY 命令不是持久的
- python - 使用 python 2.7 调用用 python 3.7 编写的函数
- android - 在所有设备上仅使用一个注册领域用户