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'])
这肯定是问题,现在我得到的原因。
任何帮助表示赞赏。
SyntaxError: invalid syntax
是python
错误。看起来你正试图在python程序中运行shell命令。您可能需要import subprocess
。
或者,也许你有#!/usr/bin/python
在shell脚本的顶部?
我将添加我的python代码的细节,然后帮助解决问题。检查以上 – 2013-03-21 16:58:23
@JoedeNecola:你可以检查你的“脚本”的'#!'行,以及你如何运行它?您正在运行'sudo'作为python命令。 – cdarke 2013-03-21 17:06:17
#!/ bin/bash是我的脚本的第一行。 python脚本没有与sudo – 2013-03-21 17:17:54
你的问题是,这一呼吁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'])
一起运行,所以在尝试使用Popen之前我的问题是,由于python脚本不会在子进程结束之前退出,它将永远保持在我的服务器上打开进程。我需要它执行./scanIPlist.sh并在之后立即退出。我应该使用哪一个?第一个? – 2013-03-21 21:25:07
如果'scanIPlist.sh'是可执行的,则应该可以工作。请注意,这会返回一个[Popen对象](http://docs.python.org/2/library/subprocess.html#popen-objects),您可以使用它来等待孩子完成。如果你想守护(disown)子进程,请参见[this question](http://*.com/questions/5772873/python-spawn-off-a-child-subprocess-detach-and-exit) – bonsaiviking 2013-03-21 21:42:25
更新:将最初的3个文件(parseXMLnmap.py,scanIPlist.sh,ip.list.orig)上的所有者更改为root并以根用户身份运行所有内容不能解决问题。 – 2013-03-21 16:16:00