0

我试图让一个 linux 二进制文件通过使用子进程将其标准输出发送到一个变量。但只是不断获得回溯。

>>> import subprocess
>>>nmap -sn -Pn todd.ns.cloudflare.com --script dns-check-zone --script-args='dns-check-zone.domain=www.macmonster.com

任何想法(哦,我使用 Python2.7)。

理想情况下,我想避免使用 Shell=true 来避免任何安全问题。

谢谢,

4

3 回答 3

5

shlex 来救援!

模块 shlex 将获取一个包含整个 shell 命令的字符串,并将其完全按照 Popen 和 check_output 的期望进行拆分。像这样:

import shlex, subprocess
cmd = "/usr/bin/nmap -sn -Pn todd.ns.cloudflare.com --script dns-check-zone --script-args='dns-check-zone.domain=www.macmonster.com'"
args = shlex.split(cmd)
output = subprocess.check_output(args)

当您查看 args 的内容时,您会看到:

>>> print args
['/usr/bin/nmap', '-sn', '-Pn', 'todd.ns.cloudflare.com', '--script', 'dns-check-zone', '--script-args=dns-check-zone.domain=www.macmonster.com']

请注意,shlex 将选项“--script dns-check-zone”拆分为两个标记。另一方面,它保留了“--script-args='dns-check-zone.domain=www.macmonster.com'”,但删除了单引号。

于 2013-05-17T19:45:12.663 回答
1
import subprocess
output = subprocess.check_output(["/usr/bin/nmap", "-sP", "-n", "172.16.1.0/24"])

output = subprocess.check_output(["/usr/bin/nmap", "-sP", "-n", "172.16.1.0/24"], stderr=subprocess.STDOUT)
于 2013-04-24T21:10:54.950 回答
0

你有没有试过这个:

p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
var = p.stdout.read()
print var

我会使用communicate,但它返回一个奇怪的列表类型的东西。

于 2013-05-16T15:04:43.797 回答