我试图让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来避免任何安全问题。
谢谢,
答案 0 :(得分:3)
模块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'”,但删除了单引号。
答案 1 :(得分: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)
答案 2 :(得分:0)
你试过这个:
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
var = p.stdout.read()
print var
我会使用communicate
,但它返回一个奇怪的列表类型的东西。