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

时间:2013-03-21 16:09:27

标签: python bash sh nmap

背景:

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

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

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:0)

SyntaxError: invalid syntaxpython错误。看起来你正试图在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'])