2015-03-02 32 views
0

我試圖在bash上運行批處理以從csv運行ping和snmp,並存儲結果或者響應或不在記事本。Unix - 運行PING和SNMP從文件到文件的Bash代碼*編輯*

文件標識單列CSV與每個服務器,並運行平,審查,運行SNMP,審覈,存儲和移動每個文件

到服務器的連接工作,但劇本一直在缺少失敗線#26錯誤/usr/tmp/testing_script.sh下:第26行:語法錯誤:文件從這裏


更新的意外結束。我已經做了一些改進,但仍然與這一個掙扎。 這是我到目前爲止的地方。

#!/bin/bash 
nombrep="pin_"$hostname 
nombres="smmp_"$hostname 
file="/usr/tmp/devices.csv" 
OLDIFS=$IFS 
IFS="," 
cat "$file" | while read col1; do 
{ 
     DNSRes=0 
     ping -q -c3 $col1 >> /usr/tmp/pin 
     grep " 100% packet loss" /usr/tmp/pin 
     if [ $? -eq 0 ]; then 
       echo $col1"," >> /usr/tmp/pin_fail 
       hostname >> /usr/tmp/pin_fail 
       echo -e "\n" >> /usr/tmp/pin_fail 
     fi 
     grep "unknown host" /usr/tmp/pin 
     if [ $? -eq 0 ]; then 
       echo $col1"," >> /usr/tmp/No_DNS 
       echo -e "\n" >> /usr/tmp/No_DNS 
     fi 
     if [ -e /usr/tmp/pin ]; then 
       rm /usr/tmp/pin 
     fi 
     if [ $DNSRes -eq 0 ]; then 
      snmp ********** $col1 1.3.6.1.2.1.1.3.0 >> /usr/tmp/smmp 
      grep "No response" /usr/tmp/smmp 
      if [ $? -eq 0 ]; then 
        echo -n $col1"," >> /usr/tmp/smmp_fail 
        hostname >> /usr/tmp/smmp_fail 
        echo -e "\n" >> /usr/tmp/smmp_fail 
      fi 
     fi 
     if [ -e /usr/tmp/smmp ]; then 
       rm -r /usr/tmp/smmp 
     fi 
} 
done 
IFS=$OLDIFS 
if [ -e /usr/tmp/pin__fail ]; then 
     mv /usr/tmp/pin_fail > /usr/tmp/$nombrep 
fi 
if [ -e /usr/tmp/smmp_fail ]; then 
     mv /usr/tmp/smmp_fail > /usr/tmp/$nombres 
fi 
exit 0;  

而且我加入從那裏我目前正在運行的這bash腳本這是一個窗口膩子接口

echo on 

pscp.exe -p -q -batch -pw #password# c:\logs\devices_gtn.csv #username#@host:/usr/tmp 
pscp.exe -p -q -batch -pw #password# c:\logs\testing_script.sh #username#@host:/usr/tmp 
plink.exe -pw #password# #username#@host "chmod 777 /usr/tmp/testing_script.sh" 
plink.exe -pw #password# #username#@host "chmod 777 /usr/tmp/devices.csv" 
plink.exe -v -pw #password# #username#@host "bash /usr/tmp/testing_script.sh" 

del /f /q c:\logs\No_DNS.csv 

pscp.exe -p -q -batch -pw #password# #username#@host:/usr/tmp/pin* c:\logs\ 
pscp.exe -p -q -batch -pw #password# #username#@host:/usr/tmp/smmp* c:\logs\ 
pscp.exe -p -q -batch -pw #password# #username#@host:/usr/tmp/No_DNS* c:\logs\No_DNS.csv 
plink.exe -pw #password# #username#@host "rm -r /usr/tmp/pin*" 
plink.exe -pw #password# #username#@host "rm -r /usr/tmp/smmp*" 
plink.exe -pw #password# #username#@host "rm -r /usr/tmp/devices*" 
plink.exe -pw #password# #username#@host "rm -r /usr/tmp/testing*" 
plink.exe -pw #password# #username#@host "rm -r /usr/tmp/No_DNS*" 

if not exist results (
    md results) 
if exist c:\logs\results\snmp_results.csv (
    del /f /q c:\logs\results\snmp_results.csv) 
if exist c:\logs\results\ping_results.csv (
    del /f /q c:\logs\results\ping_results.csv) 

if exist pin_host (
    type pin_host >> c:\logs\results\ping_results.csv) 
if not exist c:\logs\results\ping_results.csv (
    echo "ping success" >> c:\logs\results\ping_results.csv) 

if not exist results (
    md results) 
if exist smmp_host (
    type smmp_host >> c:\logs\results\snmp_results.csv) 
if not exist c:\logs\results\snmp_results.csv (
    echo "snmp success" >> c:\logs\results\snmp_results.csv) 

if exist c:\logs\No_DNS.csv (
    start notepade.exe "c:\logs\results\No_DNS.csv") 

start notepad.exe "c:\logs\results\ping_results.csv" 
start notepad.exe "c:\logs\results\snmp_results.csv" 

del /f /q c:\logs\smmp*.* 
del /f /q c:\logs\pin*.* 

exit 

因爲它是不工作的CMD文件。代碼似乎沒有問題,因爲當我從服務器本身手動執行代碼時,它部分工作,除了某些問題從csv文件中檢索信息。

所以我對這個失明,因爲我不知道什麼是失敗。

任何幫助將不勝感激!

+1

這是一個令人費解的語法錯誤,嘗試將'[$?'改爲'[$?',同樣將'0]改爲'0]'。方括號是令牌,需要遵循/在前面有一個空格才能正確解釋。 – jon 2015-03-02 15:27:33

+0

在揹包之後或之前添加一個空間似乎沒有工作。關於#26 – tanoMandanga 2015-03-02 15:32:01

+0

''的語法錯誤保持回來'而讀$ col1'應該是'while col1'。 – 2015-03-02 15:52:28

回答

0

你腳本中有一些奇怪的東西。你不會對變量DNSRes=0做任何事情來賦予它另一個值。我還建議將一個命令的輸出重定向到另一個。 此外,平安的手冊頁:

The ping utility exits with one of the following values: 
0  At least one response was heard from the specified host. 
2  The transmission was successful but no responses were received. 
any other value 
     An error occurred. These values are defined in <sysexits.h>. 

您檢查退出碼0的結論是無法ping通,把爆震系統(而不是ping的系統)的主機名/usr/tmp/pin_fail

但是,讓我們來分析你的腳本(部分):

#!/bin/bash 
nombrep="pin_"$hostname 
nombres="smmp_"$hostname 

我應該寫爲:

#!/bin/bash 
nombrep="pin_${hostname}" 
nombres="smmp_${hostname}" 

下一個部分:

file="/usr/tmp/devices.csv" 
OLDIFS=$IFS 
IFS="," 
cat "$file" | while read col1; do 

這似乎不夠公平。

{ 
    DNSRes=0 

您設置DNSRes=0這裏,從來沒有進一步改變它在腳本並檢查它,如果它仍然是零。

ping -q -c3 $col1 >> /usr/tmp/pin 
    grep " 100% packet loss" /usr/tmp/pin 
    if [ $? -eq 0 ]; then 
      echo $col1"," >> /usr/tmp/pin_fail 
      hostname >> /usr/tmp/pin_fail 
      echo -e "\n" >> /usr/tmp/pin_fail 
    fi 

我應該寫爲:

if ping -q -c3 $col1 | grep -q "100% packet loss" 
then 
    echo "${col1},$(hostname)" >> /usr/tmp/pin_fail 
fi 

或者,當你想要的榮譽ping手冊頁的建議:

ping -q -c3 ${col1} 
exitcode_ping=$? 
if [ ${exitcode_ping} -eq 2 ] 
then 
    echo "${col1},$(hostname)" >> /usr/tmp/pin_fail 
fi 

好了,你可以使用${exitcode_ping}變量進一步檢查。我會把那部分留給你。