Recientemente conseguimos que Jump Host interactúe con todos nuestros dispositivos. Es rojo, tenía 6.x y no tenemos acceso de root. Podemos realizar secuencias de comandos en Autoexpect y bash únicamente; no es posible utilizar módulos.
Fuente: Tengo 5000 dispositivos (1 por línea, 3 argumentos cada uno - Ubicación Nombre de host IP - y están separados por tabulaciones).
Tarea: buscar todos los dispositivos por ubicación (ARGV1) (digamos 5000, 40 sería para una ubicación), redirigir la salida a un archivo temporal (sin salida, eco desactivado) y ejecutar un comando para cada dispositivo en el directorio temporal. La salida debe ser para HostName ARGV2, no para IP.
Diga ping a cada dispositivo en tmp y devuelva el éxito para cada host, o inicie sesión en cada dispositivo, ejecute el comando, genere el resultado para el host y pase al siguiente en el archivo tmp.
Ejemplo de estructura de archivo de entrada:
AA Torp1 1.1.1.1
AA Torp2 2.2.2.2
BB Torp97 9.9.9.9
Supongamos que desea hacer ping a cada dispositivo desde la ubicación AA. ¿Cómo puedo escribir el script cat hosts.txt | grep AA
en tmp y luego hacer ping a cada IP, por ejemplo, 1.1.1.1
y 2.2.2.2
la salida es:
Torp1 OK si el ping se realiza correctamente Torp2 NOK si el ping no es correcto
Es el ejemplo básico... o digamos que para cada IP agrupada según la ubicación, ssh, ejecute el comando imprimir salida y luego elimine el archivo tmp.
Respuesta1
La forma sencilla de hacer esto es utilizar un while read
bucle. El formato general es:
while read var1 var2 ... varN; do something; done < inputFile
De forma predeterminada, cada línea de entrada se divide en espacios en blanco, por lo que esto es esencialmente lo que necesitas:
while read location hostname ip; do
printf "Ping of $hostname ($ip): "
ping -c1 "$ip" &>/dev/null && echo "OK" || echo "FAILED"
done < ips.txt
O, para limitar a una ubicación específica:
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
Si probamos esto con este archivo:
location1 example.com 93.184.216.34
location2 google.com 8.8.8.8
location1 bad.com 123.456.7.8
Obtenemos:
$ 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