Bash | Arquivo txt > tmp> processo tmp> saída

Bash | Arquivo txt > tmp> processo tmp> saída

recentemente conseguimos que o Jump Host interagisse com todos os nossos dispositivos. Está vermelho tinha 6.x e não temos acesso root. Podemos criar scripts apenas no Autoexpect e no bash - nenhum módulo é possível.

Fonte: Tenho 5.000 dispositivos (1 por linha, 3 argumentos cada - Location HostName IP - e eles são separados por guias).

Tarefa: Pesquise todos os dispositivos por local (ARGV1) (digamos 5000, 40 seria para um local), redirecione a saída para um arquivo temporário (sem saída, eco desativado) e execute um comando para cada dispositivo no diretório temporário. A saída deve ser para HostName ARGV2 e não IP.

Diga ping em cada dispositivo em tmp e retorne sucesso para cada host ou faça login em cada dispositivo, execute o comando, gere o resultado para o host e vá para o próximo no arquivo tmp.

Exemplo de estrutura de arquivo de entrada:

AA Torp1 1.1.1.1 
AA Torp2 2.2.2.2
BB Torp97 9.9.9.9

Digamos que você queira fazer ping em cada dispositivo do locaton AA. Como faço o script cat hosts.txt | grep AApara tmp e, em seguida, execute ping em cada IP, por exemplo, 1.1.1.1e 2.2.2.2a saída é:

Torp1 OK se o ping for bem-sucedido Torp2 NOK se o ping não estiver ok

É o exemplo básico ... ou digamos, para cada IP grepped com base na localização, ssh , execute o comando print output e remova o arquivo tmp.

Responder1

A maneira simples de fazer isso é usar um while readloop. O formato geral é:

while read var1 var2 ... varN; do something; done < inputFile

Por padrão, cada linha de entrada é dividida em espaços em branco, então isso já é essencialmente o que você precisa:

while read location hostname ip; do
    printf "Ping of $hostname ($ip): "
    ping -c1 "$ip" &>/dev/null && echo "OK" || echo "FAILED"
done < ips.txt

Ou, para limitar a um local específico:

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

Se testarmos isso com este arquivo:

location1 example.com 93.184.216.34
location2 google.com 8.8.8.8
location1 bad.com 123.456.7.8

Nós temos:

$ 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

informação relacionada