Paramiko模拟ssh -t选项

时间:2012-12-13 14:06:34

标签: python ssh paramiko

我实例化一个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 for永远不会结束。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

invoke_shell()似乎返回Channel,看起来Channel要求您明确关闭它们。我会尝试关闭你打开的一些频道,特别是invoke_shell()返回的频道。

答案 1 :(得分:-1)

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

/dev/null 2>&1

我遇到与您相同的问题 - 在我的情况下尝试远程运行bitnami控制脚本。你帖子里的东西慢跑了我的记忆,让我想起了控制脚本中的输出重定向(这些让我以前一直很头疼)。

一般情况下,他们习惯于忽略错误或者将它们记录在某个特定地方 - 我还没有机会尝试,但也许要么在脚本结束时将它们退出,或者如果你不关心响应,甚至可能手动将某些已创建的数据重定向到>& 2将起作用。