我试图通过使用subprocess将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,以避免任何安全问题。
谢谢,
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)
当你查看参数的内容时,你会看到:
>>> 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'",但去掉了单引号。
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)
你试过了吗:
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
var = p.stdout.read()
print var
我本想用communicate
,但它返回一个奇怪的列表类型的东西