Bash Script para coletar remotamente o nome do host, o IP e a memória total do host

2

Estou tentando escrever um script que coletará o nome do host, o IP e a memória total instalada em hosts remotos a partir de uma lista que eu insiro no script. O script coletará informações das máquinas Redhat e Solaris. Abaixo está o meu script:

#!/bin/bash
echo > ip_info.output
echo -e "\n"
for host in 'cat ip_adds'
do
echo "Hostname:" $host
sudo ssh -o BatchMode=yes -o ConnectTimeout=5 $host "echo IP Address:; ip route get 1 | awk '{print $NF;exit}'; free -m | grep Mem | awk '{print $1,$2}'"
echo -e "\n"
done

Quando executo o script, recebo o erro abaixo:

awk: {print ,}
awk:        ^ syntax error
awk: {print ,}
awk:         ^ syntax error
awk: cmd. line:1: {print ,}
awk: cmd. line:1:          ^ unexpected newline or end of string

Acho que o problema é com free -m | grep Mem | awk '{print $1,$2} , mas não tenho certeza de como corrigi-lo. Se eu executar free -m | grep Mem | awk '{print $1,$2} diretamente no shell, não tenho problemas. Apenas dentro do roteiro.

    
por user315468 12.10.2018 / 10:32

3 respostas

0

Isto é o que o script final parece. Eu sei que será útil para alguns de vocês lá fora.

#!/bin/bash
for host in 'cat ip_adds2'
do
echo "Hostname:" $host
sudo ssh -t -o BatchMode=yes -o ConnectTimeout=5 $host 'echo IP: 'hostname -i';read junk total used free shared buffers cached junk < <(free -g  | grep ^Mem);echo Memory: $total GiB'
echo -e "\n"
done
    
por 17.10.2018 / 12:39
6

Isso é consideravelmente mais complicado do que precisa ser. Além disso, por que você executaria ssh com sudo ? Se você precisa logar no controle remoto como root, então você pode fazer isso ( ssh root@$host ) mas é muito improvável que você precise rodar ssh com sudo a menos que todas as chaves ssh pertençam ao root. O que é uma péssima ideia.

Além disso, no meu sistema Arch, o comando que você parece estar usando para obter o IP retorna o UID do meu usuário:

$ ip route get 1
1.0.0.0 via 192.168.1.1 dev enp0s31f6 src 192.168.1.111 uid 1000 
    cache 
$ ip route get 1 | awk '{print $NF;exit}'; 
1000

Funciona como esperado em um Ubuntu que testei:

$ ip route get 1
1.0.0.0 via 123.456.7.8 dev eth0  src 123.456.7.9
$ ip route get 1 | awk '{print $NF;exit}'; 
123.456.7.9

Então talvez uma versão mais portátil disso seja imprimir o campo depois de src :

$ ip route get 1 | sed -nE 's/.* src ([0-9.]+).*//p'
192.168.1.111

Os erros que você viu foram de fato por causa de citações. Como você estava executando ssh $host "command" , as aspas duplas em torno de command fazem com que o shell expanda quaisquer variáveis encontradas dentro do comando (assim, coisas como awk's $2 etc). Para evitar isso e passar os símbolos não expandidos para o awk, você precisa escapar do $ .

Uma versão mais simples do seu script:

#!/bin/bash
sshOpts="BatchMode=yes -o ConnectTimeout=5"
echo > ip_info.output
echo ""                
while read host; do
    printf "Hostname:%s" $host
    ssh -o $sshOpts $host "printf 'Hostname: %s\nIP: %s\nMem: %s\n' $host "$(ip route get 1 | sed -nE 's/.* src ([0-9.]+).*//p')" "$(free -m | awk '/Mem/{print $2}')""
done < ip_adds
    
por 12.10.2018 / 11:09
3

Eu encontrei uma resposta para isso. Tinha a ver com a fuga, então eu adicionei \ antes $ 1 e $ 2 conforme abaixo:

free -m | grep Mem | awk '{print \,\}
    
por 12.10.2018 / 10:49