Unix - Bash 代码到 运行 PING 和 SNMP 从一个文件到一个文件*编辑*
Unix - Bash code to run PING and SNMP from a file to a file *EDIT*
我正在尝试 运行 在 bash 上进行批处理以从 csv 运行 ping 和 snmp 并将结果存储在记事本上。
文件标识每个服务器的单列 CSV,运行 ping、审查、运行 snmp、审查、存储和移动每个文件
与服务器的连接正常,但脚本在错误 /usr/tmp/testing_script.sh: line 26: syntax error: unexpected end of file
下的缺失行 #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 脚本的位置添加 cmd 文件,该脚本位于 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 文件检索信息的一些问题。
所以我对这个视而不见,因为我不知道失败的原因。
任何帮助将不胜感激!
您的脚本中有些奇怪的地方。您不对变量 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>.
您检查退出代码 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}
变量进行进一步检查。我会把那部分留给你。
我正在尝试 运行 在 bash 上进行批处理以从 csv 运行 ping 和 snmp 并将结果存储在记事本上。
文件标识每个服务器的单列 CSV,运行 ping、审查、运行 snmp、审查、存储和移动每个文件
与服务器的连接正常,但脚本在错误 /usr/tmp/testing_script.sh: line 26: syntax error: unexpected end of file
下的缺失行 #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 脚本的位置添加 cmd 文件,该脚本位于 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 文件检索信息的一些问题。
所以我对这个视而不见,因为我不知道失败的原因。
任何帮助将不胜感激!
您的脚本中有些奇怪的地方。您不对变量 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>.
您检查退出代码 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}
变量进行进一步检查。我会把那部分留给你。