【发布时间】:2023-03-11 23:23:01
【问题描述】:
我正在尝试在 bash 上运行批处理,以从 csv 运行 ping 和 snmp,并将结果存储在记事本上或响应或不响应。
该文件用每个服务器标识单列 CSV,并运行 ping、review、运行 snmp、review、存储和移动每个文件
与服务器的连接正常,但脚本在错误 /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 文件,该文件是我当前在 windows-putty 界面上运行此 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
按原样,不工作。该代码似乎很好,因为当我从服务器本身手动执行时,它部分工作,除了从 csv 文件中检索信息的一些问题。
所以我对这个视而不见,因为我不知道什么是失败的。
任何帮助将不胜感激!
【问题讨论】:
-
这是一个复杂的语法错误,请尝试将
[$?更改为[ $?,同样将0]的出现次数更改为0 ]。方括号是标记,需要在后面/前面加一个空格才能正确解释。 -
在 backets 之后或之前添加一个空格似乎不起作用。不断返回有关第 26 行的语法错误
-
while read $col1应该是while read col1。 -
是的,我今天早些时候确实尝试了这两种方法,但仍然无法弄清楚。无论如何,错误都会不断出现
-
现在您必须卷起袖子,注释掉脚本底部的 1/2。运行它,您仍然收到错误消息吗?如果是,请注释掉脚本底部的 3/4。如果没有错误消息,则取消注释 1/2 的注释(允许
while .. done、if..then ..fi块(和其他多行语法)被完全注释或取消注释)。所以你必须注释掉代码,看看问题是否消失,然后再取消注释,看看是哪一组行产生了错误。