lendo arquivo usando para, while - behavior

0

Considere o cenário abaixo

2 vms - 192.168.229.131, 192.168.229.132

Tanto a vms tem seu ip como 192.168.229.151 & 192.168.229.152 em seu arquivo /etc/hosts

Digamos que existem cerca de 50 vms, como eu disse acima. Mas a partir de agora, estou considerando apenas os 2 acima.

Eu salvei ips dos 2 vms em um arquivo chamado server

#cat server
192.168.229.131
192.168.229.132

Abaixo está o script

#!/bin/bash
cat server | while read line
do
/usr/bin/sshpass -e ssh -t -q -o StrictHostKeyChecking=no root@$line << EOF
echo successfully logged in $line
MYIP=$(ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*//p')
for i in 151 152
do
echo 192.168.229.\$i >> errips
done
for data in 'cat errips'
do
echo data currently has $data
grep $data /etc/hosts
if [ $? -eq 0 ]
then
sed -i "s/$data/$MYIP/g" /etc/hosts
echo "completed"
unset MYIP
rm -rf errips
exit 0
fi
done
EOF
done

Abaixo está a saída

root@master:~# ./script
cat: errips: No such file or directory
successfully logged in 192.168.229.131
cat: errips: No such file or directory
successfully logged in 192.168.229.132

Por que o loop for após o login no servidor está sendo executado antes do login?

Eu tentei usar o abaixo em vez de 'for'

cat errips |while read line
echo line currently has $line

Neste caso, descobri que a linha ainda está recebendo o IP do arquivo do servidor em localhost, enquanto ele deve lê-lo a partir do arquivo errips do servidor no qual eu fiz o login remotamente.

A saída foi

line currently has 192.168.229.131
line currently has 192.168.229.132

Considerando que eu esperava que ele deveria ler os valores no arquivo "errips" e a saída deveria ser algo como abaixo

line currently has 192.168.229.151
line currently has 192.168.229.151

Agora, tentei abaixo do comando

cat errips |while read data
echo data currently has $data

Neste caso, a saída estava vazia para os dados do valor

data currently has 
data currently has

Como eu iria ler o arquivo "errips" no meu servidor remoto linha por linha, e grep para a linha em / etc / hosts e então executar o loop if, que irá substituir o ip errado pelo ip direito?

    
por Being Gokul 18.10.2014 / 10:48

1 resposta

1

Você precisa citar apenas sua string de limite de documento aqui, caso contrário, a substituição de parâmetro será ativada. Isso deve funcionar:

#!/bin/bash
cat server | while read line
do
  /usr/bin/sshpass -e ssh -t -q -o StrictHostKeyChecking=no root@$line <<'EOF'
  echo successfully logged in $line
  MYIP=$(ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*//p')
  for i in 151 152
  do
    echo 192.168.229.$i >> errips
  done
  for data in 'cat errips'
  do
    echo data currently has $data
    grep $data /etc/hosts
    if [ $? -eq 0 ]
    then
      sed -i "s/$data/$MYIP/g" /etc/hosts
      echo "completed"
      unset MYIP
      rm -rf errips
      exit 0
    fi
  done
EOF
done

Observe as aspas simples em torno de EOF. Para iluminar ainda mais, tente o seguinte:

/usr/bin/sshpass -e ssh -t -q -o StrictHostKeyChecking=no root@<your_ip> 'k=1; echo $k'
/usr/bin/sshpass -e ssh -t -q -o StrictHostKeyChecking=no root@<your_ip> "k=1; echo $k"
/usr/bin/sshpass -e ssh -t -q -o StrictHostKeyChecking=no root@<your_ip> "k=1; echo \$k"
    
por 18.10.2014 / 15:09