2017-08-21 68 views
1

如果我單獨運行這個命令:子運行命令,直至第一管,然後停止

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 

你會注意到評論「命令」,因爲我已經嘗試過作爲「命令」和「命令1」。的兩個返回輸出:

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

你試圖東西兩個獨立的命令('nmap'和'awk')合併爲一個'POPEN()'調用,這是不是它如何工作。請參閱下面的@ delta的答案。 –

+0

啊,好吧。我認爲你可以把Popen()當作一個巨大的班輪,只要它能正確執行它自己的bash。說得通。謝謝! – cootermelon

回答

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是通過shell = True顯式調用的,應用程序有責任確保所有空白和元字符都被恰當引用以避免shell注入漏洞。


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

這工作,謝謝。 – cootermelon