PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Shellscript: Eintrag auslesen und ersetzen



DocThor
06-05-2004, 15:05
Moin :),

ich hab mir mit ein wenig halbwissen ein kleines Script schreiben wollen welches Einträge in der /etc/hosts macht und gleichzeitig noch abfragt ob diese evtl. schon vorhanden sind und die option gibt diese zu ersetzen. Die Abfrage funktioniert ganz gut (lediglich name wird nicht genommen ich muss Name eingeben) und das komplette script läuft ohne Fehlermeldung durch. Trotzdem habe ich danach keinen geänderten Eintrag in der /etc/hosts.

In meinem Beispiel habe ich einen Eintrag in der /etc/hosts bei welchem die IP schon vorhanden ist, allerdings mit einem anderen Namen. Diesen möchte ich ersetzen...geht nich :(



#!/usr/bin/ksh
## 03.05.04 Thorsten Kocks
set -x
if [ $# -ne 2 ]
then
echo "Usage: vi_hosts ip name"
exit 1
fi

if grep "$1" /etc/hosts
then
echo "IP schon vorhanden"
elif grep "$2" /etc/hosts
then
echo "Name schon vorhanden"
else
echo $1 $2 >> /etc/hosts
fi
IP=`grep $1 /etc/hosts`
NAME=`grep $2 /etc/hosts`
while :
do
echo "Eintrag ersetzen? (ip/name/n) \c"
read OK < /dev/tty || break
case $OK in
[ip|IP])
echo "ip wird ersetzt"
sed s/"$NAME"/"$1 $2"/g /etc/hosts
exit 0 ;;
[name|Name|NAME])
echo "Name wird ersetzt"
sed s/"$IP"/"$1 $2"/g /etc/hosts
exit 0 ;;
[nN])
exit 0 ;;
*) ;;
esac
done

peschmae
06-05-2004, 15:43
damit Sed an einer Datei was ändert musst du -i verwenden:

sed s/"$NAME"/"$1 $2"/g -i /etc/hosts

ausserdem ersetzt hier das Sed den Hostnamen durch IP und neuen Hostnamen - also wird vermutlich aus einem
192.168.1.33 chef
bei einem start mit 192.168.1.33 boss daraus ein
192.168.1.33 192.168.1.33 boss

vielleicht irre ich mich auch - habs nicht ausprobiert oder ganz genau angeguckt. Auf jeden Fall müsstest du dann sowas machen:

sed s/".*$NAME.*/"$1 $2"/g -i /etc/hosts

das ersetzt dann alle Zeilen in denen $NAME vorkommt komplett durch "$1 $2"
Selbiges wohl auch für IP.

Aber bitte zuerst an einem Backup üben :D

MfG Peschmä

DocThor
07-05-2004, 07:06
Moin :),

dange ersma...das wars aber leider nich :(
Das mit dem -i hab ich gestern schon getestet und habs wieder rausgenommen.
Ich dachte erst ich hab evtl. irgendwo was falsch geschrieben, war aber wohl nich so:

echo Name wird ersetzt
Name wird ersetzt
+ sed s/10.20.20.30 eha04/10.20.20.30 eha07/g -i /etc/hosts
sed: Cannot find or open file -i.

andere Vorschläge?? :)

peschmae
07-05-2004, 10:15
doch, es ist schon -i, da bin ich mir recht sicher. Binhier leider gerade @windows - nix zum testen.

Bist du sicher dass du die Berechtigung hast die Datei zu ändern? Also root.

Ach ja, und gehts wenn du was einfacheres machst? Möglicherweise gibts probleme wegen der .e und anderer Sonderzeichen in dem String (weil Sed . und so interpretiert). Glaub ich zwar nicht, weil . ist irgend ein Zeichen und das wäre ja auch ein .

Oder hast du ein anderes (älteres?) sed - hab gerade gesehen dass ich hier auf Win auch eins hab, und das kann kein -i
Dann musst du halt
sed s///g </etc/hosts >/etc/hosts.new
mv /etc/hosts.new /etc/hosts

MfG Peschmä

DocThor
07-05-2004, 10:31
jo...liegt wohl am sed.

Das


sed s///g </etc/hosts >/etc/hosts.new
mv /etc/hosts.new /etc/hosts

funktioniert, führt allerdings dazu das bei einem fehler die hosts geleert wird :eek:


+ sed s//10.20.20.40 eha07/g
+ 0< /etc/hosts 1> /etc/hosts.new
sed: The first regular expression cannot be null.
+ mv /etc/hosts.new /etc/hosts
+ exit 0
root@tru2 / > cat /etc/hosts
root@tru2 / >



=/

aber jetzt hab ich ja wieder ein anderes Prob und das lässt sich sicher einfacher lösen :)
Ich meld mich wenn ich´s geschaft hab :D

Danke und Gruss

DocThor

peschmae
07-05-2004, 15:38
Original geschrieben von DocThor
funktioniert, führt allerdings dazu das bei einem fehler die hosts geleert wird :eek:


uiui. Du kannst ja ein Backup machen (lassen):


mv -b /etc/hosts.new /etc/hosts

if [ ! -s /etc/hosts ]; then
mv /etc/hosts~ /etc/hosts
fi


stellt dir auch gleich das Backup wieder her wenn was schief gelaufen d.h. /etc/hosts jetzt leer ist :)

MfG Peschmä

DocThor
10-05-2004, 10:01
Moin :),

mv -b iss nich. Da bekomm ich gesacht das -b eine illegal option iss.

Ich machs nun so und das klappt einwandfrei :)


root@erde /usr/users/safltt0 > cat vi_hosts
#!/usr/bin/ksh
## 03.05.04 Thorsten Kocks
set -x
if [ $# -ne 2 ]
then
echo "Usage: vi_hosts ip name"
exit 1
fi
cp /usr/users/safltt0/hosts hosts.old
IP=`grep $1 /usr/users/safltt0/hosts`
NAME=`grep $2 /usr/users/safltt0/hosts`
if grep "$1" /usr/users/safltt0/hosts
then
echo "IP schon vorhanden"
while :
do
echo "Name austauschen? (y/n) \c"
read OK < /dev/tty || break
case $OK in
[jJyY])
echo "Name wird ausgetauscht"
sed s/"$IP"/"$1 $2"/g </usr/users/safltt0/hosts > /usr/users/safltt0/hosts.new
mv /usr/users/safltt0/hosts.new /usr/users/safltt0/hosts
if [ ! -s /usr/users/safltt0/hosts ]; then
mv /usr/users/safltt0/hosts.old /usr/users/safltt0/hosts
fi
exit 0 ;;
[nN])
exit 0 ;;
*) ;;
esac
done
elif grep "$2" /usr/users/safltt0/hosts
then
echo "Name schon vorhanden"
while :
do
echo "IP austauschen? (y/n) \c"
read OK < /dev/tty || break
case $OK in
[jJyY])
echo "IP wird ausgetauscht"
sed s/"$NAME"/"$1 $2"/g </usr/users/safltt0/hosts > /usr/users/safltt0/hosts.new
mv /usr/users/safltt0/hosts.new /usr/users/safltt0/hosts
if [ ! -s /usr/users/safltt0/hosts ]; then
mv /usr/users/safltt0/hosts.old /usr/users/safltt0/hosts
fi
exit 0 ;;
[nN])
exit 0 ;;
*) ;;
esac
done
else
echo $1 $2 >> /usr/users/safltt0/hosts
fi


Vielen Dank nochma :)

DocThor
10-05-2004, 10:21
edit:

ich hab noch ne kleine Fehlerabfrage eingebaut.
Iss zwar etwas unübersichtlicher Krautcode aber immerhin gehts :D



#!/usr/bin/ksh
## 03.05.04 Thorsten Kocks
#set -x
if [ $# -ne 2 ]
then
echo "Usage: vi_hosts ip name"
exit 1
fi
cp /usr/users/safltt0/hosts hosts.old
IP=`grep $1 /usr/users/safltt0/hosts`
NAME=`grep $2 /usr/users/safltt0/hosts`
if grep "$1" /usr/users/safltt0/hosts
then
echo "IP schon vorhanden"
while :
do
echo "Name austauschen? (y/n) \c"
read OK < /dev/tty || break
case $OK in
[jJyY])
echo "Name wird ausgetauscht"
if grep "$2" /usr/users/safltt0/hosts
then
echo "Fehler: Name schon vergeben"
exit 0
else
sed s/"$IP"/"$1 $2"/g </usr/users/safltt0/hosts > /usr/users/safltt0/hosts.new
mv /usr/users/safltt0/hosts.new /usr/users/safltt0/hosts
fi
if [ ! -s /usr/users/safltt0/hosts ]; then
mv /usr/users/safltt0/hosts.old /usr/users/safltt0/hosts
fi
exit 0 ;;
[nN])
exit 0 ;;
*) ;;
esac
done
elif grep "$2" /usr/users/safltt0/hosts
then
echo "Name schon vorhanden"
while :
do
echo "IP austauschen? (y/n) \c"
read OK < /dev/tty || break
case $OK in
[jJyY])
echo "IP wird ausgetauscht"
if grep "$1" /usr/users/safltt0/hosts
then
echo "Fehler: IP schon vergeben"
exit 0
else
sed s/"$NAME"/"$1 $2"/g </usr/users/safltt0/hosts > /usr/users/safltt0/hosts.new
mv /usr/users/safltt0/hosts.new /usr/users/safltt0/hosts
fi
if [ ! -s /usr/users/safltt0/hosts ]; then
mv /usr/users/safltt0/hosts.old /usr/users/safltt0/hosts
fi
exit 0 ;;
[nN])
exit 0 ;;
*) ;;
esac
done
else
echo $1 $2 >> /usr/users/safltt0/hosts
fi

peschmae
10-05-2004, 19:21
Original geschrieben von DocThor
mv -b iss nich. Da bekomm ich gesacht das -b eine illegal option iss.


Ja sag mal, was hast denn du da für ein OS bzw was coreutils?
Oder verwendest du etwa nicht die von GNU?

Hätte nicht gedacht dass es mit der Interoperabilität so wenig weit her ist.

MfG Peschmä

DocThor
12-05-2004, 09:04
Moin :),

ich arbeit hier auf tru64, da fehlt wohl so manches :(

peschmae
12-05-2004, 12:58
ah, ok :)

Dann weiss ich jetzt wenigstens dass ich diesbezüglich nicht all zu viel erwarten kann.

MfG Peschmä