2013-03-21 197 views
1

背景:Shell脚本错误|在命令行工作 - 不在脚本中

我正在使用NMAP,shell脚本和python脚本在IP列表上运行扫描。 python部分解析nmap的XML输出以生成两个列表,即活动主机和主机的列表。直到一个成为活着和信息将追加到XML和主机的两份名单被纠正了蟒蛇,然后重新执行下来主机遍地的名单上的shell脚本(起点)。

问题: 这是曾经工作,但现在我得到奇怪的行为(语法错误)在运行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) 
[email protected]????:~/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 

我在查明困惑是哪里的问题是什么?当我使用这个命令: “命令的nmap -v -sS -oX全scan.xml --append - 输出--no-样式-IL ip.list.down”

在命令行

..它工作完全正常。你可以看到nmap正在执行这个命令,那么从那里发出的错误会阻止我的脚本的其余部分继续?

如果我注释掉每一行中的nmap命令后,它的工作原理,所以我想也许是权限问题,但我试图执行与须藤的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 

所以问题是,我需要一个循环,永远不会结束,但不守创造越来越多的流程。

用户输入开始 - >外壳脚本 - > - Python脚本 - >外壳脚本 - > ....等等,直到由用户中断。

以前,在我的Python代码我使用:

subprocess.call(['./scanIPList.sh', 'ip.list.down']) 

这是没有好,因为流程会继续开放,它只会保留遍地创建它们,直到计算机最终会崩溃。我需要它从子进程中分离并在执行下一个脚本时退出。

我尝试使用这样的:

subprocess.Popen([sys.executable, './scanIPlist.sh', 'ip.list.down']) 

这肯定是问题,现在我得到的原因。

任何帮助表示赞赏。

+0

更新:将最初的3个文件(parseXMLnmap.py,scanIPlist.sh,ip.list.orig)上的所有者更改为root并以根用户身份运行所有内容不能解决问题。 – 2013-03-21 16:16:00

回答

0

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

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

+0

我将添加我的python代码的细节,然后帮助解决问题。检查以上 – 2013-03-21 16:58:23

+0

@JoedeNecola:你可以检查你的“脚本”的'#!'行,以及你如何运行它?您正在运行'sudo'作为python命令。 – cdarke 2013-03-21 17:06:17

+0

#!/ bin/bash是我的脚本的第一行。 python脚本没有与sudo – 2013-03-21 17:17:54

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']) 
+0

一起运行,所以在尝试使用Popen之前我的问题是,由于python脚本不会在子进程结束之前退出,它将永远保持在我的服务器上打开进程。我需要它执行./scanIPlist.sh并在之后立即退出。我应该使用哪一个?第一个? – 2013-03-21 21:25:07

+0

如果'scanIPlist.sh'是可执行的,则应该可以工作。请注意,这会返回一个[Popen对象](http://docs.python.org/2/library/subprocess.html#popen-objects),您可以使用它来等待孩子完成。如果你想守护(disown)子进程,请参见[this question](http://stackoverflow.com/questions/5772873/python-spawn-off-a-child-subprocess-detach-and-exit) – bonsaiviking 2013-03-21 21:42:25