Shell脚本错误 | 命令行可用 - 脚本中无效
背景:
我正在使用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'])
这可能就是我现在遇到问题的原因。
任何帮助都非常感谢。
2 个回答
SyntaxError: invalid syntax
是一个 python
的错误。看起来你是在试图在一个 python 程序中运行 shell 命令。你可能需要加上 import subprocess
。
或者,你的 shell 脚本的开头可能有 #!/usr/bin/python
?
你的问题是,这个调用 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'])