hosts-Datei per shell-skript verändern

B

Breze

Grünschnabel
Hallo,
ich bin in Sachen shellscripting ein absoluter Anfänger, aber vielleicht hat ja jemand genau das was ich bräuchte, oder zumindest so etwas ähnliches.

Ich bräuchte ein Shellscript, das mir

1. den Wochentag bestimmt (z.B. Dienstag)

und dann anhand dieses Wochentages in der Datei etc/hosts eine bestimmte IP-Adresse ändert. Diese IP-Adresse findet man wiederum in einer anderen Datei die in etwa so aussieht:

Montag 192.168.1.1
Dienstag 192.168.1.3
Mittwoch192.168.1.15

Vielleicht hat ja jemand schon so etwas in der Art programmiert.
 
hallo,

würde an Deiner Stelle, die IP-Adressen und Wochentage fest als Variablen in Deinem Script hinterlegen.

1. Führe den Befehl date aus, nur dass die Ausgabe in einer Datei geschrieben wird.

2. an Hand des Befehls grep, oder uniq kannst Du die Zeichenkette, z.B. Wed, für Mittwoch, mit dem Inhalt der Variable, die Du oben mit Mittwoch deklariert hast vergleichen und dann entsprechend die IP-Adresse zuordnen.

Gruss stoerfang
 
den wochentag (0-6) erhältst du mit
Code:
date +%w
die entsprechende ip-adresse dann mit
Code:
NEUEADRESSE=$(grep Mittwoch adressen.txt|cut -d" " -f2)
die ersetzung in der /etc/hosts musst du dann halt mit sed oder awk machen, z.b.
Code:
sed "s/.* hostxy/$NEUEADRESSE hostxy/" /etc/hosts
 
Hallo
Eine Scriptfabrik sind wir hier eigentlich nicht.
Also was hast du selbst versucht bisher?
Wo ist das Problem?
Welche Shell verwendest du?

@ninguno ?

$date +"%w"
3
$ date --version
date (coreutils) 5.2.1
Geschrieben von David MacKenzie.
Welches date verwendest du?
$date "%A"
Mittwoch

Wenn mehr als ein Leerzeichen als Trennzeichen verwendet wird, hilft tr -d weiter, damit cut das richtige Feld ausgibt.

GNU sed kennt die Option -i zum direkten Editieren (insert)

Dann sollte es klappen.

Gruß Wolfgang
 
Wenn Du in Deine Datei die Wochentage englisch schreibst, kommst Du an die ip mittels

Code:
NEUEADRESSE=$(grep $(date +%A) adressen.txt|cut -d" " -f2)

Gruss, Phorus

edit: ich sehe gerade, es kommt auf die Lokalisation an, ob date englische oder deutsche Wochetage ausgibt.
 
Zuletzt bearbeitet:
Wolfgang_1 schrieb:
@ninguno ?

$date +"%w"
3
$ date --version
date (coreutils) 5.2.1
Geschrieben von David MacKenzie.
Welches date verwendest du?
$date "%A"
Mittwoch
ja die option %A gibts bei mir auch, die gibt die namen halt in englisch aus, deswegen option %w
Code:
WEEKDAYS=("Sonntag" "Montag" "Dienstag" "Mittwoch" "Donnerstag" "Freitag" "Samstag")
echo ${WEEKDAYS[$(date +%w)]}
 
Hallo
Es kommt auf die gesetzte Spracheinstellung des jeweiligen Users an was zurückgegeben wird.
Ich kann diese date aber mit auf den Weg geben.
Example:
Code:
$ LC_ALL="POSIX" date +"%A"
Wednesday
$ LC_ALL="de_DE@euro" date +"%A"
Mittwoch

Gruß Wolfgang
 
Mich würde interessieren, warum sich die ips tagesabhängig verändern.
 
Hallo,

ersteinmal vielen Dank für eure Hilfe, bin schon ein großes Stück weiter gekommen.

Mein Skript sieht mittlerweile folgendermaßen aus:

#!/bin/sh

WOCHENTAG=`date +%A`
case "$WOCHENTAG" in

Monday)NEUEADRESSE=$(grep $WOCHENTAG GEVO_LAENDER.txt|cut -d" " -f2)
sed "s/.* APPSERVER/$NEUEADRESSE APPSERVER/" etc/hosts;;

Tuesday)NEUEADRESSE=$(grep $WOCHENTAG GEVO_LAENDER.txt|cut -d" " -f2)
sed "s/.* APPSERVER/$NEUEADRESSE APPSERVER/" etc/hosts;;

Wednesday)NEUEADRESSE=$(grep $WOCHENTAG GEVO_LAENDER.txt|cut -d" " -f2)
sed "s/.* APPSERVER/$NEUEADRESSE APPSERVER/" /etc/hosts;;

Thursday)NEUEADRESSE=$(grep $WOCHENTAG GEVO_LAENDER.txt|cut -d" " -f2)
sed "s/.* APPSERVER/$NEUEADRESSE APPSERVER/" etc/hosts;;

Friday)NEUEADRESSE=$(grep $WOCHENTAG GEVO_LAENDER.txt|cut -d" " -f2)
sed "s/.* APPSERVER/$NEUEADRESSE APPSERVER/" etc/hosts;;

esac

#reboot


Das einzige Problem was ich nun noch habe ist, das nach ausführen des Skriptes mir die hosts-Datei mit der veränderten IP richtig angezeigt wird, diese Änderung aber nicht gespeichert wird. Was muss ich da noch tun, damit die Änderungen auch übernommen werden.

Gruss
Breze
 
Breze schrieb:
Hallo,

ersteinmal vielen Dank für eure Hilfe, bin schon ein großes Stück weiter gekommen.

Mein Skript sieht mittlerweile folgendermaßen aus:

#!/bin/sh

WOCHENTAG=`date +%A`
case "$WOCHENTAG" in

Monday)NEUEADRESSE=$(grep $WOCHENTAG GEVO_LAENDER.txt|cut -d" " -f2)
sed "s/.* APPSERVER/$NEUEADRESSE APPSERVER/" etc/hosts;;

Tuesday)NEUEADRESSE=$(grep $WOCHENTAG GEVO_LAENDER.txt|cut -d" " -f2)
sed "s/.* APPSERVER/$NEUEADRESSE APPSERVER/" etc/hosts;;

Wednesday)NEUEADRESSE=$(grep $WOCHENTAG GEVO_LAENDER.txt|cut -d" " -f2)
sed "s/.* APPSERVER/$NEUEADRESSE APPSERVER/" /etc/hosts;;

Thursday)NEUEADRESSE=$(grep $WOCHENTAG GEVO_LAENDER.txt|cut -d" " -f2)
sed "s/.* APPSERVER/$NEUEADRESSE APPSERVER/" etc/hosts;;

Friday)NEUEADRESSE=$(grep $WOCHENTAG GEVO_LAENDER.txt|cut -d" " -f2)
sed "s/.* APPSERVER/$NEUEADRESSE APPSERVER/" etc/hosts;;

esac

#reboot

Ich verstehe den Sinn Deiner case-Umgebung nicht.
 
Phorus schrieb:
Ich verstehe den Sinn Deiner case-Umgebung nicht.


Ganz einfach:

Ich sitze hier in einer Testumgebung eines großen Elektronikdiscounters wo deren Warenwirschaftssystem getestet wird. Dazu gehören u. a. auch Kassen die mit LINUX laufen und die mit einer Datenbank verbunden sind.
Die IP der Datenbank bekommt die Kasse eben aus der etc/hosts.
Wir haben aber hier in unserer Testumgebung nicht so viele Kassen wie Datenbanken, und damit ich nicht jeden Tag per Hand diesen Eintrag ändern muss werde ich das ganze nun automatisieren, mit Hilfe dieses Scripts und eines Eintrages in der Crontab.

Gruss
 
Hallo
Ich sehe hier auch ein useless case.
Das macht doch nur Sinn, wenn du abhängig von verschiedenen Bedingungen verschiede Aktionen willst.

Du hast wohl etwas um die Ecke gedacht, denn so kompliziert muss es nicht sein. ;)
Passiert schon mal.
Aber wenn du wirklich mit case arbeiten willst, dann brauchst du bei grep nicht mehr die variable $Wochentag einsetzen, sondern kannst gleich nach Klartext suchen.
Example:
case "$WOCHENTAG" in

Monday)NEUEADRESSE=$(grep Montag GEVO_LAENDER.txt|cut -d" " -f2)


Wie du es machst, machst du - egal welche Bedingung zutrifft - immer das Gleiche.

Aber das geht eleganter:
Example:
Code:
#wir haben eine Variable, die wir am Anfang festlegen:
[b]Wochentag=$(date +"%A")[/b]
# nun holen wir die zugehörige IP aus einer datei und speichern sie in einer weiteren Variable:
[b]NEWIP=$(grep $WOCHENTAG GEVO_LAENDER.txt|cut -d" " -f2)[/b]
#Nun haben wir schon die richtige IP, brauchen also kein select case mehr
#einfach ersetzen bei GNU sed mit Option -i
[b]sed -i -e "s/.*\(APPSERVER\)/$NEWIP \1/g" /etc/hosts[/b]
Ohne Kommentar sind das drei Zeilen.

Das geht sogar noch kürzer, aber das lassen wir jetzt mal, soll ja verständlich sein. ;)
Ohne GNU sed kannst du dir mit perl behelfen.
Das geht fast genauso, nur musst du die Variable NEWIP exportieren und dann per $ENV{NEWIP} darauf zugreifen.
Code:
[b]export NEWIP && perl -pi -e '~s/.*(APPSERVER)/$ENV{NEWIP} $1/ig' etc/hosts[/b]
Dass sollte sogar mit minimalistischem Linux gehen, denn perl ist essentiell für Linux.

Den Einzeiler erspar ich dir jetzt mal.

Hoffe verständlich gewesen zu sein.

Gruß Wolfgang
 
Zuletzt bearbeitet:
Danke Wolfgang_1, für die Erklärung, habs jetzt kapiert das die case-Umgebung überflüssig ist.
Der Perl-Befehl funktioniert wunderbar.

Wenn ich das ganze aber mit sed mache kennt er die Option -i aber nicht.

Ausgabe auf sed -V:

GNU sed version 3.02

Ist das eine zu alte Version?
 
ja ist ziemlich alt
Code:
sed --version
GNU sed version 4.1.2
dann musst du halt den output von sed in eine datei umleiten
Code:
sed "s/.* APPSERVER/$NEUEADRESSE APPSERVER/" /etc/hosts > /etc/hosts.neu
 

Ähnliche Themen

Heimserver Konfiguration für Ubuntu Server?!

Kopieren von Dateien per Shell

Zurück
Oben