1

背景:

我正在使用 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'])

这一定是我现在遇到的问题的原因。

任何帮助表示赞赏。

4

2 回答 2

0

SyntaxError: invalid syntax是一个python错误。看起来您正试图在 python 程序中运行 shell 命令。你可能需要import subprocess.

或者也许你有#!/usr/bin/python在你的 shell 脚本的顶部?

于 2013-03-21T16:47:32.363 回答
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'])
于 2013-03-21T20:21:14.643 回答