最近,我们让 Jump Host 能够与我们所有的设备进行交互。 6.x 是红色的,我们没有 root 访问权限。我们只能在 Autoexpect 和 bash 上编写脚本 - 不可能有模块。
来源:我有 5000 个设备(每行 1 个,每个参数 3 个 - 位置主机名 IP - 并且它们是制表符分隔的)。
任务:搜索每个位置 (ARGV1) 的所有设备(假设 5000、40 表示一个位置),将输出重定向到临时文件(无输出,回显关闭),并为临时目录中的每个设备运行命令。输出应该是 HostName ARGV2 而不是 IP。
说 ping tmp 中的每个设备并为每个主机返回成功,或者登录到每个设备,运行命令,输出主机结果并移至 tmp 文件中的下一个。
输入文件结构示例:
AA Torp1 1.1.1.1
AA Torp2 2.2.2.2
BB Torp97 9.9.9.9
假设您想从 AA 位置对每个设备执行 ping 操作。如何编写cat hosts.txt | grep AA
tmp 脚本,然后 ping 每个 IP,例如1.1.1.1
,2.2.2.2
输出为:
如果 ping 成功则 Torp1 OK 如果 ping 不成功则 Torp2 NOK
它的基本示例......或者说,对于每个基于位置、 ssh 进行 grep 的 IP,运行命令打印输出,然后删除 tmp 文件。
答案1
执行此操作的简单方法是使用while read
循环。一般格式为:
while read var1 var2 ... varN; do something; done < inputFile
默认情况下,每个输入行都按空格分割,因此这基本上已经是您所需要的:
while read location hostname ip; do
printf "Ping of $hostname ($ip): "
ping -c1 "$ip" &>/dev/null && echo "OK" || echo "FAILED"
done < ips.txt
或者,限制到特定位置:
grep location ips.txt | while read location hostname ip; do
printf "Ping of $hostname ($ip): "
ping -c1 "$ip" &>/dev/null && echo "OK" || echo "FAILED"
done
如果我们用这个文件测试一下:
location1 example.com 93.184.216.34
location2 google.com 8.8.8.8
location1 bad.com 123.456.7.8
我们得到:
$ grep -w "^$location" ips.txt |
while read location hostname ip; do
printf "Ping of $hostname ($ip): ";
ping -c1 "$ip" &>/dev/null && echo "OK" || echo "FAILED";
done
Ping of example.com (93.184.216.34): OK
Ping of bad.com (123.456.7.8): FAILED