/etc/hosts mit einem Script editieren

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Maverick83
Beiträge: 20
Registriert: 03.12.2007 15:31:57

/etc/hosts mit einem Script editieren

Beitrag von Maverick83 » 12.12.2007 14:01:35

Hallo Zusammen

Ich habe ein Programm laufen, dass nur einwandfrei funktioniert, wenn die korrekte IP Adress mit dem Hostname zusammen unter /etc/hosts steht.

Die /etc/hosts sieht so aus:

Code: Alles auswählen

127.0.0.1	localhost
127.0.1.1	DoorSteward.edu.ds.fhnw.ch
10.195.12.40	DoorSteward 

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
Logischerweise kann die IP Adresse in Zeile 3 ständig ändern.
Ich möchte dafür ein Script schreiben, dass die aktuelle IP Adresse in das File schreibt.
Wie mache ich das am besten?
Wie kann ich genau in der Zeile 3 die IP überschreiben?

Oder kann ich das durch ein anderes Tool machen lassen?

Danke für Eure Vorschläge

Michi

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 12.12.2007 14:45:27

hi,

man könnte bind9 installieren, aber so sollte es auch gehen:

Code: Alles auswählen

#!/bin/sh
set -e

INTERFACE=eth0        # ggf. anpassen
HOSTNAME=DoorSteward  # dto.

IP=`ifconfig $INTERFACE | grep 'inet addr:' | cut -d':' -f 2 | cut -d' ' -f 1`
grep -v " $HOSTNAME$" /etc/hosts > /etc/hosts.tmp
echo $IP "$HOSTNAME" >> /etc/hosts.tmp
mv /etc/hosts.tmp /etc/hosts
Beware of programmers who carry screwdrivers.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 12.12.2007 15:07:51

Sollte wohl auch mit sed und der Option -i und dem substitude Kommando funktionieren.
Weiß nur nicht genau, wie du dann bei sed die Variable IP übergeben kannst, die vorher belegen müsstest.
Oh, yeah!

Maverick83
Beiträge: 20
Registriert: 03.12.2007 15:31:57

Beitrag von Maverick83 » 12.12.2007 15:23:10

Danke cosmac für die Hilfe, es läuft scho gut, nur wird die alte IP nicht durch die aktuelle überschrieben sondern nur unten ans File angehängt.

Wie überschreibe ich die alte IP mit der Neuen?

Geht das vielleicht mit dem substitude Kommando? So wie es Duff geschrieben hat.
nur weis ich nicht wie verwenden.

Danke

edit: Einfachheits halber könnte man die Zeile auch an den Anfang schrieben und immer die erste Zeile löschen und neu schreiben aber:
Wie lösche isch die erste Zeile in einem File und wie schriebe ich an den Anfang eines Files?

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 12.12.2007 16:20:32

geht's vielleicht, wenn du die alte Zeile einmal von Hand löschst?
Beware of programmers who carry screwdrivers.

Maverick83
Beiträge: 20
Registriert: 03.12.2007 15:31:57

Beitrag von Maverick83 » 12.12.2007 16:45:33

Danke ich habs rausgefunden, dein Script macht ja scho alles nur halt in die falsche Zeile.

Ich schreibe nun zuerst die IP und den Hostnamen ins hosts.tmp und erst anschliessend mit grep alles andere.

Es funktioniert gut, danke und einen schönen Abend

Michi

Benutzeravatar
The Torso
Beiträge: 882
Registriert: 13.07.2003 12:46:40
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von The Torso » 13.12.2007 00:37:21

Wenn wir davon ausgehn, dass die Zeile als letztes angehaent wird (und dort auch schon steht), sollte es ungefaehr so gehn:

Code: Alles auswählen

#!/bin/sh
set -e

INTERFACE=eth0        # ggf. anpassen
HOSTNAME=DoorSteward  # dto.
LINES=`cat /etc/hosts | wc -l`
IP=`/sbin/ifconfig $INTERFACE | grep 'inet addr:' | cut -d':' -f 2 | cut -d' ' -f 1 | awk -F " " ' { print $1 } ' | head -n 1`

head -n `expr "${LINES}" - 1` /etc/hosts > /etc/hosts.tmp
echo "$IP  DoorSteward" >> /ets/hosts.tmp
mv /etc/hosts.tmp /etc/hosts
# Bis auf die oben markierte Stelle ($LINES - 1`) sollte das Skript dann funktionieren!

[EDIT] So, hab noch einige Schwachstellen im Skript beseitigt, jetzt sollte es wirklich funktionieren! Konnte es aber selber nicht Testen. Bevor du das Skript testest musst du aber 1mal die IP als letztes in die /etc/hosts eintragen, sonst loescht es dir einen Eintrag!!!!!
Debian GNU/Linux 00101010

Benutzeravatar
finupsen
Beiträge: 1327
Registriert: 21.04.2004 20:07:05
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dortmund
Kontaktdaten:

Beitrag von finupsen » 13.12.2007 02:12:48

Code: Alles auswählen

sed -e 's/^\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\s\+\(DoorSteward$\)/'`ifconfig eth0|grep inet|cut -d : -f 2|cut -d \  -f 1`'\t\2/' /etc/hosts
Niemand hat vor eine zentrale Datensammelbehörde aufzubauen. Es handelt sich vielmehr um dezentrale IT-Systeme die miteinander vernetzt werden.
... und Wasser ist naß.

Maverick83
Beiträge: 20
Registriert: 03.12.2007 15:31:57

Beitrag von Maverick83 » 18.12.2007 17:17:39

Hallo Zusammen,

Ich hab das Script nun so geschrieben, nicht sehr schön aber es funktioniert (begrenzt)

Code: Alles auswählen

#!/bin/sh
set -e

INTERFACE=rausb0        # ggf. anpassen
HOSTNAME=DoorSteward  # dto.

IP=`/sbin/ifconfig rausb0 | grep 'inet Adresse:' | cut -d':' -f 2 | cut -d' ' -f 1`
echo $IP "      $HOSTNAME" > /tmp/hosts.tmp
grep -v "$HOSTNAME$" /etc/hosts > /tmp/hosts1.tmp
less /tmp/hosts.tmp > /tmp/hosts2.tmp
less /tmp/hosts1.tmp >> /tmp/hosts2.tmp
cp /tmp/hosts2.tmp /etc/hosts
Der hacken an der Sache ist nun, dass ich das Script unter /etc/rc2.d verlinkt habe, es wird beim Start auch ausgeführt, also der hostname wird in die erste Zeile geschrieben, aber leider ohne IP Adresse.
Wenn ich das Script aber nach dem Starten selbst aufrufe funktioniert es.

Kann mir jemand sagen was ich falsch gemacht habe?

vielen Dank
Michi

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 24.12.2007 10:05:55

Würde mal fast vermuten, dass die IP-Adresse (das ifconfig <device>) erst nach deinem Skript aufgerufen wird und deshalb kann dein Skript keine IP-Adresse vergeben.
Oh, yeah!

Antworten