Golpe | Archivo de texto> tmp> proceso tmp> salida

Golpe | Archivo de texto> tmp> proceso tmp> salida

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 AAen tmp y luego hacer ping a cada IP, por ejemplo, 1.1.1.1y 2.2.2.2la 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 readbucle. 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

información relacionada