subprocess运行命令到第一个管道,然后停止

时间:2017-08-21 23:46:23

标签: python awk subprocess nmap

如果我自己运行此命令:

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?

由于

1 个答案:

答案 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 considerationsshell=True

  

与其他一些popen函数不同,此实现永远不会隐式调用系统shell。这意味着所有字符(包括shell元字符)都可以安全地传递给子进程。如果通过shell = True显式调用shell,那么应用程序有责任确保适当地引用所有空格和元字符以避免shell注入漏洞。

  1. https://docs.python.org/3/library/subprocess.html#replacing-shell-pipeline
  2. https://docs.python.org/3/library/subprocess.html#security-considerations