2

我读过很多例子,但没有一个适用于这个特定的任务。

Python代码:

x = Popen(commands, stdout=PIPE, stderr=PIPE, shell=True)
print commands
stdout = x.stdout.read()
stderr = x.stderr.read()
print stdout, stderr
return stdout

输出:

[user@host]$ python helpers.py
['ssh', '-t', 'user@host', ' ', "'service --status-all'"]
 usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-e escape_char] [-F configfile]
           [-I pkcs11] [-i identity_file]
           [-L [bind_address:]port:host:hostport]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-R [bind_address:]port:host:hostport] [-S ctl_path]
           [-W host:port] [-w local_tun[:remote_tun]]
           [user@]hostname [command]

为什么我会收到此错误?使用 os.popen(...) 它可以工作,它至少可以执行,但我无法通过 SSH 隧道检索远程命令的输出。

4

1 回答 1

9

我认为您的命令列表是错误的:

commands = ['ssh', '-t', 'user@host', "service --status-all"]
x = Popen(commands, stdout=PIPE, stderr=PIPE)

此外,shell=True如果您要将列表传递给Popen.

例如,要么这样做:

Popen('ls -l',shell=True)

或这个:

Popen(['ls','-l'])

但不是这个:

Popen(['ls','-l'],shell=True)

最后,还有一个方便的函数可以像你的 shell 一样将一个字符串拆分成一个列表:

import shlex
shlex.split("program -w ith -a 'quoted argument'")

将返回:

['program', '-w', 'ith', '-a', 'quoted argument']
于 2013-01-18T21:42:43.767 回答