Lesen von Dateien mit for, while - Verhalten

Lesen von Dateien mit for, while - Verhalten

Betrachten Sie das folgende Szenario

2 VMS - 192.168.229.131, 192.168.229.132

Beide VMs haben die IP-Adresse 192.168.229.151 und 192.168.229.152 in ihrer /etc/hostsDatei

Nehmen wir an, es gibt etwa 50 VMs, wie ich oben sagte. Aber im Moment berücksichtige ich nur die oben genannten 2.

Ich habe die IPs der beiden VMs in einer Datei mit dem Namen Server gespeichert

#cat server
192.168.229.131
192.168.229.132

Unten ist das Skript

#!/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

Unten ist die Ausgabe

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

Warum wird die For-Schleife nach der Anmeldung beim Server vor der Anmeldung ausgeführt?

Ich habe versucht, das Folgende anstelle von „for“ zu verwenden.

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

In diesem Fall habe ich festgestellt, dass die Zeile immer noch die IP aus der Serverdatei im lokalen Host übernimmt, obwohl sie diese aus der Errips-Datei des Servers lesen sollte, bei dem ich mich remote angemeldet habe.

Die Ausgabe war

line currently has 192.168.229.131
line currently has 192.168.229.132

Ich hatte erwartet, dass die Werte in der Datei „errips“ gelesen werden und die Ausgabe etwa wie folgt aussehen sollte:

line currently has 192.168.229.151
line currently has 192.168.229.151

Nun habe ich den folgenden Befehl ausprobiert

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

In diesem Fall war die Ausgabe für den Wert Daten leer

data currently has 
data currently has

Wie lese ich die Datei „errips“ auf meinem Remote-Server zeilenweise, suche in /etc/hosts nach der Zeile und führe dann die if-Schleife aus, die die falsche IP durch die richtige ersetzt?

Antwort1

Sie müssen Ihre Dokumentbegrenzungszeichenfolge hier in einfache Anführungszeichen setzen, sonst wird die Parameterersetzung aktiviert. Das sollte funktionieren:

#!/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

Beachten Sie die einfachen Anführungszeichen um EOF. Um dies noch weiter zu verdeutlichen, versuchen Sie Folgendes:

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

verwandte Informationen