Paramiko exec命令基于时间失败

时间:2013-11-19 13:36:45

标签: python ssh paramiko

我一直在寻找并在这个问题上愚弄这个问题2天了。首先,以(汇总)代码的形式提供一些上下文。

def setService(self, ...
    ssh_client = self.conn.get_ssh_client(hostname, username=username, password=password)
    setCommand = str('service ' + service_name + ' ' + status)
    stdin, stdout, stderr = ssh_client.exec_command(setCommand)
    # time.sleep(2)
    return ...

其次。整个代码集使用相同的代码,除了这个“service foobar stop”和“service foobar start”命令之外,一切都有效。它会导致读取错误(在ssh / auth.log中)并且实际上不会影响该命令。使用此设置的所有其他命令工作正常(我们做了大约10个不同的命令)。它发生在所有目标机器上,来自两台开发机器,因此我排除了ssh配置。

但是,如果我在exec_command(在注释位置)之后添加任何时间延迟代码,它就可以工作。 sleep(2)或执行某些调试打印的循环使其工作正常。读取错误从auth.log和服务启动/停止中消失。取消睡眠或其他任何可能会再次打破睡眠。

我们通过在那里休眠来“修复”修复它,但我不完全理解它为什么会发生,或者为什么在函数中停止修复它。

我们回来太快了,在远程方面执行完毕之前?我不这么认为,它似乎是阻塞(返回stdin,stderr,stdout)。

对此的任何建议都将受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

注意: exec_command(command)non-blocking ..

我通常会尝试read来自缓冲区的输出(这会消耗一些时间 - 在返回之前),或者我使用您在这种情况下使用的time.sleep

如果您使用(应该)stdout.read()/readlines(),它会强制您的脚本返回stdout缓冲区中的输出,然后等待exec_command完成。