4

我实例化一个 paramiko 通道,然后我执行一个命令并获得它的输出:

channel = transport.open_session()
channel.exec_command('service myservice restart')

stdout = channel.makefile('rb')

for line in stdout:
    print line,

但是,在执行命令(完成)后,输出迭代被阻塞。

我用 ssh 测试过:

ssh myhost service myservice restart     # terminal gets blocked
ssh -t myhost service myservice restart  # OK

所以我想模拟 paramiko 中的“-t”选项。到目前为止,我尝试过:

channel = transport.open_session()
channel.get_pty()
channel.invoke_shell()

stdin, stdout = channel.makefile('wb'), channel.makefile('rb')
stdin.write('service myservice restart\n')

for line in stdout:
    print line,

但是现在,stdout 没有关闭,for 永远不会结束。

有任何想法吗?

4

2 回答 2

0

看起来像invoke_shell()返回 a Channel,看起来像Channels 要求你明确地关闭它们。我会尝试关闭您正在打开的一些频道,特别是由invoke_shell().

于 2012-12-16T17:29:16.127 回答
-1

查看您尝试运行的脚本 - 看看是否有这样的行

/dev/null 2>&1

我和你有同样的问题——在我的例子中,我试图远程运行一个 bitnami 控制脚本。您帖子中的某些内容让我记忆犹新,并让我想起了控制脚本中的输出重定向(这些让我以前很头疼)。

通常他们习惯于忽略错误或者将它们记录在某个特定的地方——我还没有机会尝试,但也许要么在脚本末尾将它们传回,或者如果你不关心响应,甚至可以手动重定向一些创建的data out >&2 会起作用。

于 2013-05-14T19:24:08.317 回答