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)

最後に、シェルと同じ方法で文字列をリストに分割するための便利な関数が存在します。

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

戻ります:

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