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