背景:
我正在使用 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
所以问题是我需要一个永不结束的循环,但不会继续创建越来越多的进程。
用户输入开始 -> Shell 脚本 -> Python 脚本 -> Shell 脚本 -> .... 依此类推,直到被用户打断。
以前,在我的 python 代码中,我使用的是:
subprocess.call(['./scanIPList.sh', 'ip.list.down'])
这并不好,因为这些进程会保持打开状态,并且只会一遍又一遍地创建它们,直到计算机最终崩溃。我需要它从子进程中分离并在它执行下一个脚本时退出。
我尝试使用这个:
subprocess.Popen([sys.executable, './scanIPlist.sh', 'ip.list.down'])
这一定是我现在遇到的问题的原因。
任何帮助表示赞赏。