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