猛击 | Txt 文件 > tmp> 处理 tmp> 输出

猛击 | Txt 文件 > tmp> 处理 tmp> 输出

最近,我们让 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 AAtmp 脚本,然后 ping 每个 IP,例如1.1.1.12.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

相关内容