Shell脚本错误 | 命令行可用 - 脚本中无效

1 投票
2 回答
1307 浏览
提问于 2025-04-17 19:54

背景:

我正在使用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 个回答

0

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

或者,你的 shell 脚本的开头可能有 #!/usr/bin/python

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

撰写回答