如果我自己运行此命令:
nmap -PN -p 22 --open -oG - 10.15.86.0/24 | awk '$NF~/ssh/{print$2}' > sshopen.txt
我收到了我想要的输出:
10.15.86.4
10.15.86.5
10.15.86.9
10.15.86.11
etc...
我网络上的所有主机都有一个打开的ssh端口。 但是,当我尝试在Python子进程中运行相同的命令时,它似乎跳过了awk。下面的Python:
import subprocess
subnet = raw_input("Enter subnet to scan: ")
command1 = "nmap -PN -p 22 --open -oG - 10.15.86.0/24 | awk '$NF~/ssh /{print$2}' > sshopen.txt".split()
#command = ["nmap", "-PN", "-p", "22", "--open", "-oG", "-", subnet, "|", "awk", "'$NF~/ssh/{print $2}'", ">", "sshopen.txt"]
nmap = subprocess.Popen(command1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
nmap_info, out = nmap.communicate()
print nmap_info
您会注意到已评论的“命令”,因为我已经尝试过'命令'和' command1'。两者都返回输出:
Host: 10.15.86.4 () Status: Up
Host: 10.15.86.4 () Ports: 22/open/tcp//ssh///
Host: 10.15.86.5 () Status: Up
Host: 10.15.86.5 () Ports: 22/open/tcp//ssh///
etc...
它输出好像没有管道awk(nmap -PN -p 22 --open -oG - 10.15.86.0/24)而不是(nmap -PN -p 22 --open -oG - 10.15.86.0/ 24 | awk' $ NF~ / ssh / {print $ 2}'> sshopen.txt)。 为什么不在脚本中应用awk?
由于
答案 0 :(得分:0)
尝试
p1 = Popen(["nmap", "-PN", "-p", "22", "--open", "-oG", "-", subnet], stdout=PIPE)
p2 = Popen(["awk", "$NF~/ssh/{print$2}"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()
output = p2.communicate()[0]
或
check_output(command, shell=True)
这是来自python的官方subprocess doc。
虽然有一些security considerations与shell=True
。
与其他一些popen函数不同,此实现永远不会隐式调用系统shell。这意味着所有字符(包括shell元字符)都可以安全地传递给子进程。如果通过shell = True显式调用shell,那么应用程序有责任确保适当地引用所有空格和元字符以避免shell注入漏洞。