我有一个脚本,用于检查 IP 是否有 ping 回复,然后尝试对它们运行 snmpwalk。我试图安排脚本在 cron 中每周运行一次。当我在 shell 中运行脚本时,它运行完美。当我在 webmin 中执行 cron 时,它会跳过第二个 do/done 集。
该脚本对 IP .21 到 .30 执行 ping 操作,并将它们写入“hostip”文件。然后,它通过 snmpwalk 命令运行该文件的每一行。
#!/bin/bash
#USAGE: âscriptname 10.1.1â³
set +x
for i in {21..30};
do fping -t300 -a $1.$i >> hostip
done
set -x
cat hostip | while read line;
do
echo snmpwalk -v 2c -c public "$line" iso.3.6.1.2.1.17.4.3.1;
snmpwalk -v 2c -c public "$line" iso.3.6.1.2.1.17.4.3.1;
done
wait
rm -Rf hostip
当我在交互式 shell (SSH) 中运行时,会创建主机文件并执行 snmpwalk。但是,当我在 Webmin 中的 root cron 上单击“立即运行”时,我看到:
+ set +x
+ cat hostip
+ read line
+ wait
+ rm -Rf hostip
它不返回 snmpwalk 命令。如何让脚本在 cron 中运行,就像在 inveractive shell 中运行一样?我尝试在线研究,但找不到 echo 或 while read 行导致问题的情况。该脚本是可执行的
答案1
你可以尝试一下这个。
fping -t300 -a $1.{21..30} | while read online_ip; do
echo snmpwalk -v 2c -c public $online_ip iso.3.6.1.2.1.17.4.3.1;
snmpwalk -v 2c -c public $online_ip iso.3.6.1.2.1.17.4.3.1;
done
这将执行相同的操作,但不是将 fping 的输出通过管道传输到文件,而是可以简单地将该输出通过管道传输到 while 循环中。