Shell-Script was Config speziell bearbeitet

B

beijo

Grünschnabel
Hallo,

ich Suche ein Shellscript, was mittels aufruf eine configdatei bearbeitet. Der Configfile sieht z.b. so aus:

Code:
subnet 192.168.1.0 netmask 255.255.255.0 {
#        range 192.168.1.10 192.168.1.198;
}
host testclient {
        hardware ethernet 01:22:15:C9:E3:7B;
        fixed-address 192.168.1.40;
        filename "pxelinux.0";
        next-server 192.168.1.199;
        option subnet-mask 255.255.255.0;
        option broadcast-address 192.168.1.255;
        option routers 192.168.1.2;
        option domain-name-servers 192.168.1.2;
}

host client2 {
        hardware ethernet 01:22:15:B9:E3:7B;
        fixed-address 192.168.1.40;
        filename "pxelinux.0";
        next-server 192.168.1.199;
        option subnet-mask 255.255.255.0;
        option broadcast-address 192.168.1.255;
        option routers 192.168.1.2;
        option domain-name-servers 192.168.1.2;
}
host client3 {
        hardware ethernet 01:22:15:B9:E3:7B;
        fixed-address 192.168.1.40;
        filename "pxelinux.0";
        next-server 192.168.1.199;
        option subnet-mask 255.255.255.0;
        option broadcast-address 192.168.1.255;
        option routers 192.168.1.2;
        option domain-name-servers 192.168.1.2;
}
host client4 {
        hardware ethernet 01:22:15:B9:E3:7B;
        fixed-address 192.168.1.40;
        filename "pxelinux.0";
        next-server 192.168.1.199;
        option subnet-mask 255.255.255.0;
        option broadcast-address 192.168.1.255;
        option routers 192.168.1.2;
        option domain-name-servers 192.168.1.2;
}

das script soll jetzt per übergabe z.b. (./script client4 comment) bis zu client4 gehen und dann 3 und 4 zeilen weiter hüpfen und jeweils das "filename pxelinux.0" und "next-server 192.168.1.199" ausdokumentieren. dann das in dem config file abspeichern....das ganze soll anders rum natürlich auch funktionieren. hab bisher nirgendswo etwas gefunden wo man mittels sed und awk etwas bis zu einer zeilen suchen kann, aber dann einfach nochmal 3 zeilen und dann noch 1 zeile weiterhüpft und dort erst die veränderung macht.

für eure hilfe wäre ich euch dankbar.

grüße
beijo
 
Hallo
Das Script wird dir hier keiner erstellen.
Wir sind schließlich keine Skriptfabrik. ;)
Aber ein paar hilfreiche Hinweise lassen sich schon geben.
Dazu müsstest du aber schon sagen, um welche Shell und welches OS es sich handelt.

Da gibt es nämlich gravierende Unterschiede.

Zu GNU sed z.B.
Da gibt es die Option -i -> ändert direkt in der Datei
Unter Solaris wirst du damit im Gegensatz nicht weit kommen.

Um z.B. die nächsten drei Zeilen nach einem Pattern-Match zu lesen und die dritte zu verändern:

Code:
echo -ne "Text\ntest=wert1\ntest2=wert2\ntest3=wert3\nweiteres\n"|
sed -e '/test/{N;N;N;s/\(test3=wert3\)/#\1/}'
Text
test=wert1
test2=wert2
#test3=wert3
weiteres

Nur als Denkanstoß

Wolfgang
 
Zuletzt bearbeitet:
danke für deine hilfe ;)

also wenn ich jetzt das
Code:
 cat configfile | sed -e '/client2 /{N;N;N;s/\(client2\)/#\1/}'
auf meinen configfile anwende kommt das dabei raus

Code:
subnet 192.168.1.0 netmask 255.255.255.0 {
#        range 192.168.1.10 192.168.1.198;
}
host testclient {
        hardware ethernet 01:22:15:C9:E3:7B;
        fixed-address 192.168.1.40;
        filename "pxelinux.0";
        next-server 192.168.1.199;
        option subnet-mask 255.255.255.0;
        option broadcast-address 192.168.1.255;
        option routers 192.168.1.2;
        option domain-name-servers 192.168.1.2;
}

host #client2 {
        hardware ethernet 01:22:15:B9:E3:7B;
        fixed-address 192.168.1.40;
        filename "pxelinux.0";
        next-server 192.168.1.199;
        option subnet-mask 255.255.255.0;
        option broadcast-address 192.168.1.255;
        option routers 192.168.1.2;
        option domain-name-servers 192.168.1.2;
}
host client3 {
        hardware ethernet 01:22:15:B9:E3:7B;
        fixed-address 192.168.1.40;
        filename "pxelinux.0";
        next-server 192.168.1.199;
        option subnet-mask 255.255.255.0;
        option broadcast-address 192.168.1.255;
        option routers 192.168.1.2;
        option domain-name-servers 192.168.1.2;
}
host client4 {
        hardware ethernet 01:22:15:B9:E3:7B;
        fixed-address 192.168.1.40;
        filename "pxelinux.0";
        next-server 192.168.1.199;
        option subnet-mask 255.255.255.0;
        option broadcast-address 192.168.1.255;
        option routers 192.168.1.2;
        option domain-name-servers 192.168.1.2;
}

ich möchte aber jetzt ja dass am anfang der filename zeile ein # gesetzt wird / oder eben entfernt .... mhh
 
Ich würde mir ein perl-script schreiben, so ein sed-Einzeiler wird doch recht schnell extrem unübersichtlich.....

Dafür müsstest du dir nur die Basics von Perl anschauen + regular expressions.
 
Hier ist eins:
PHP:
#!/usr/bin/perl
$host = $ARGV[0];

$modify_on = 0;

while($line = <STDIN>) {
	my $filtered_line = $line;

	if( $filtered_line =~ /^\\\s*host\\s+$host/) {
		$modify_on = 1;
	}

	if ($modify_on) {
		if ($filtered_line =~ /^\s*filename/) {
			$filtered_line = "#".$filtered_line;
		}
		elsif( $filtered_line =~ /^\s*next-server/ ) {
			$filtered_line = "#".$filtered_line;
		}
		elsif (my ($rest) = $filtered_line =~ /^\s*#(\s*filename.*)/) {
			$filtered_line = $rest."\n";
		}
		elsif (my ($rest) = $filtered_line =~ /^\s*#(\s*next-server.*)/) {
			$filtered_line = $rest."\n";
		}

		if ( $filtered_line =~ /\}$/) {
			$modify_on = 0;
		}
	}

	print $filtered_line;
}
Benutzung
Code:
<diesesscript.pl>  < Eingabedatei clientX
Problem ist, dass man natürlich nicht in einen zum Lesen geöffneten Filedescriptor schreiben kann. Du musst Deine dhcpd.conf vorher umkopieren.

Wenn Du eine komplizierte und große dhcpd.conf hast wäre es überlegenswert ob Du die hosts in einer group unterbringst, um die vielen options zu sparen.

Schreib doch die MAC-Adresse, die IP und den Hostnamen in eine MySQL-Datenbank, editiere die Einträge mit phpMyAdmin, lass ein ein Perl-Script die Host-Sektion immer komplett neu erzeugen und binde diese mit include in die dhcpd.conf ein.
 
Zuletzt bearbeitet:
Wenn du "host client2" durch "#host client2" ersetzen willst, dann musst du das auch in die Klammer aufnehmen.

BTW Eine fette MySQL laufen zu lassen, nur weil das Editieren einer Datei zu kompliziert sein soll?
Unglaublich...


Wolfgang
 
Wolfgang, warum nicht? So ein MySQL Dingens lässt sich als Konfigdatenbank für diverse Dienste benutzen (ich nehme allerdings LDAP für mein DHCP) und wenn ich so auf meine Systemauslastung schaue, dann sehe ich, dass mich ein MySQL der sowieso den Großteil der Zeit nix macht, mir keine Nachteile bringt. Und mal ehrlich, die Datenbank steht auch innerhalb von Minuten. Allerdings kann man statt dem PHP Management Tool dann auch die Aufgabe in PHP-Cli umsetzen, also Zeit spart man wohl nicht so sehr..

EDIT: Oha, den Vorschlag, dann daraus die Config zu generieren habe ich nicht gesehen. Dann finde selbst ich das übertrieben. Ich dachte man könnte den DHCP Server an die DB hängen.
 
Hallo
Das Script wird dir hier keiner erstellen.
Wir sind schließlich keine Skriptfabrik. ;)

Manchmal vielleicht doch :)...; mit Deinen hilfreichen Hinweisen war das doch nicht sooo schwer:
Einen GNU-sed vorraussetzend:

Hin:
Code:
cat comment.sh
#!/bin/sh

[ $# -lt 2 ] && echo "Usage $0 <string> file" && exit 1

sed -i /"$1"/'{N;N;N;s/[ ]*filename/#&/};'/"$1"/'{N;N;N;N;s/[ ]*next\-server/#&/}' "$2"

Zurück:
Code:
cat uncomment.sh
#!/bin/sh

[ $# -lt 2 ] && echo "Usage: $0 <string> file" && exit 1

sed -i /"$1"/'{N;N;N;s/#//};'/"$1"/'{N;N;N;N;s/#//}' "$2"
 
Wenn du "host client2" durch "#host client2" ersetzen willst, dann musst du das auch in die Klammer aufnehmen.
Genau das Umgekehrte passiert hier. Leider hats im Quellcode die Backslashes erwischt.
BTW Eine fette MySQL laufen zu lassen, nur weil das Editieren einer Datei zu kompliziert sein soll? Unglaublich
EDIT: Oha, den Vorschlag, dann daraus die Config zu generieren habe ich nicht gesehen. Dann finde selbst ich das übertrieben.
Nicht, wenn das Ganze ein Tool mit Weboberfläche werden soll, um eine Serverfarm remote zu administrieren. Und das soll's tatsächlich werden...
 
Zuletzt bearbeitet:
Wo bitte steht das im Eröffnungspost? Konfigurationsmanagement ist was anderes und da macht es wieder Sinn. In der Regel verteilt diese Engine dann die Konfigurationen ja auf diverse Hosts. Für die gestellte Frage oversized.
 

Ähnliche Themen

Adressvergabe in anderen Subnets

Zugriff auf Samba Fileserver Freigaben verweigert(Samba 4 Active Directory Domäne)

dhcp, arpwatch, flip-flop, iPhone

Debian 7.6 kein lokales Netz

Debian Gateway

Zurück
Oben