Unix - 用于将PING和SNMP从文件运行到文件的Bash代码*编辑*

时间:2015-03-02 15:18:28

标签: bash unix sh ping snmp

我正在尝试在bash上运行批处理以从csv运行ping和snmp并将结果存储在记事本上或不响应。

该文件标识每个服务器的单列CSV,并运行ping,查看,运行snmp,查看,存储和移动每个文件

与服务器的连接正在运行,但脚本在错误/usr/tmp/testing_script.sh下的第26行丢失失败:第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;    

此外,我正在添加cmd文件,我正在运行此bash脚本,该脚本位于windows-putty界面

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

实际上,不起作用。代码似乎很好,因为当我从服务器本身手动执行它时,它部分工作,除了从csv文件中检索信息的一些问题。

所以我对这个失明了,因为我不知道失败了什么。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

你的脚本中有一些奇怪的东西。您没有对变量DNSRes=0执行任何操作以为其提供其他值。我还建议将一个命令的输出重定向到另一个命令。 此外,从ping的手册页:

 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>.

检查exitcode 0以断定ping失败并将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}变量进行进一步检查。我会把那部分留给你。