2013-03-21 258 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

相關問題