leer archivo usando for, while - comportamiento

leer archivo usando for, while - comportamiento

Considere el siguiente escenario

2 máquinas virtuales: 192.168.229.131, 192.168.229.132

Ambos vms tienen su IP como 192.168.229.151 y 192.168.229.152 en su /etc/hostsarchivo .

Digamos que hay alrededor de 50 máquinas virtuales como dije anteriormente. Pero por ahora, estoy considerando sólo los 2 anteriores.

Guardé las ips de los 2 vms en un archivo llamado servidor

#cat server
192.168.229.131
192.168.229.132

A continuación se muestra el guión.

#!/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]*).*/\2/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

A continuación se muestra la salida

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 qué el bucle for después de iniciar sesión en el servidor se ejecuta antes de iniciar sesión?

Intenté usar lo siguiente en lugar de 'para'

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

En este caso, descubrí que la línea todavía toma la IP del archivo del servidor en localhost, mientras que debería leerla del archivo errips del servidor en el que inicié sesión de forma remota.

La salida fue

line currently has 192.168.229.131
line currently has 192.168.229.132

mientras que esperaba que leyera los valores en el archivo "errips" y que la salida fuera algo como lo siguiente

line currently has 192.168.229.151
line currently has 192.168.229.151

Ahora, probé el siguiente comando

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

En este caso, la salida estaba vacía para los datos del valor.

data currently has 
data currently has

¿Cómo podría leer el archivo "errips" en mi servidor remoto línea por línea, buscar la línea en /etc/hosts y luego ejecutar el bucle if, que reemplazará la IP incorrecta con la IP correcta?

Respuesta1

Debe colocar comillas simples en la cadena de límite de su documento aquí; de lo contrario, se habilitará la sustitución de parámetros. Esto debería 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]*).*/\2/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 las comillas simples alrededor de EOF. Para iluminar más, pruebe lo siguiente:

/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"

información relacionada