背景:
我正在使用NMAP,shell脚本和python脚本在IP列表上运行扫描。 python部分解析nmap的XML输出以生成两个列表,即活动主机和主机的列表。然后python一遍又一遍地重新执行向下主机列表中的shell脚本(起始点),直到一个变为活动状态,并且信息被附加到xml上,并且两个主机列表得到纠正。
问题: 这曾经有效但现在我在下载主机列表上运行shell脚本时会遇到奇怪的行为(语法错误)。
Script:
# Grap Complete Info in XML file
sudo nmap -v -sS -oX full-scan.xml --append-output --no-stylesheet -iL $1
# Set permissions of xml for python script to write
sudo chmod a+rw full-scan.xml
# Clean NMAP XML Root Appends
sed '/<?xml/s/.*//' full-scan.xml > scan.tmp && mv scan.tmp full-scan.xml
sed 's/<\/nmaprun>//g' full-scan.xml > scan.tmp && mv scan.tmp full-scan.xml
sed '/<nmaprun/d' full-scan.xml > scan.tmp && mv scan.tmp full-scan.xml
echo "<nmaprun>" | cat - full-scan.xml > temp && echo "</nmaprun>" >> temp
mv temp full-scan.xml
# Run python parser here
./parseXMLnmap.py full-scan.xml
Error:
./scanIPlist.sh ip.list.down
Starting Nmap 5.00 ( http://nmap.org ) at 2013-03-21 11:55 EDT
....
Nmap done: 8 IP addresses (0 hosts up) scanned in 0.59 seconds
Raw packets sent: 16 (672B) | Rcvd: 0 (0B)
de????@????:~/workspace/nmap-script$ File "./scanIPlist.sh", line 6
sudo nmap -v -sS -oX full-scan.xml --append-output --no-stylesheet -iL $1
^
SyntaxError: invalid syntax
当我使用此命令时,我很难找到问题所在的位置: “sudo nmap -v -sS -oX full-scan.xml --append-output --no-stylesheet -iL ip.list.down”
在命令行中它完全正常。你可以看到nmap正在执行命令,那么来自那个停止我的脚本的其余部分的错误来自哪里?
如果我在nmap命令之后注释掉每一行它可以工作,所以我认为可能是一个权限问题,但我尝试用sudo执行sed和mv命令,但这并没有解决问题。
Permissions are as follows after the first run on the ORIGINAL IP list:
ls -l
total 32
-rw------- 1 user user 11469 2013-03-21 12:03 full-scan.xml
-rw------- 1 user user 110 2013-03-21 12:03 ip.list.down
-rw------- 1 user user 238 2013-03-20 14:44 ip.list.orig
-rw------- 1 user user 128 2013-03-21 12:03 ip.list.up
-rwx--x--x 1 user user 1528 2013-03-21 10:26 parseXMLnmap.py
-rwx--x--x 1 user user 676 2013-03-21 12:02 scanIPlist.sh
所以问题是我需要一个永不停止的循环,但不会继续创建越来越多的进程。
用户输入开始 - &gt; Shell脚本 - &gt; Python脚本 - &gt; Shell脚本 - &gt; ....等等,直到被用户打断。
以前,在我使用的python代码中:
subprocess.call(['./scanIPList.sh', 'ip.list.down'])
这并不好,因为这些进程会保持打开状态,并且会一直反复创建它们,直到计算机最终崩溃。我需要它从子进程中分离并在执行下一个脚本时退出。
我试过用这个:
subprocess.Popen([sys.executable, './scanIPlist.sh', 'ip.list.down'])
这一定是我现在遇到问题的原因。
任何帮助表示感谢。
答案 0 :(得分:0)
SyntaxError: invalid syntax
是python
错误。看起来你正试图在python程序中运行shell命令。您可能需要import subprocess
。
或许你的shell脚本顶部有#!/usr/bin/python
?
答案 1 :(得分:0)
你的问题是这次对subprocess.Popen的调用实际上是在调用Python解释器(来自sys.executable):
subprocess.Popen([sys.executable, './scanIPlist.sh', 'ip.list.down'])
以下是一些有用的背景信息:
>>> import sys
>>> print sys.executable
/usr/bin/python
>>>
Popen的第一个参数应该是要传递给exec
(或类似)的数组或字符串,所以这种情况下的第一个参数应该是“/ bin / sh”或“./ scanIPlist.sh“,如果该shell脚本是可执行的:
subprocess.Popen(['/bin/sh', './scanIPlist.sh', 'ip.list.down'])
# or
subprocess.Popen(['./scanIPlist.sh', 'ip.list.down'])