2013-06-07 4 views
5

Ich versuche, ein Bash-Skript zu schreiben, um verschiedene Aspekte eines Servers zu konfigurieren. Der Kontext hier ersetzt einen Wert einer Variablen in einer conf-Datei (ini-Format) durch einen anderen Wert.Update var in ini-Datei mit bash

Der Kontext ist

[ssh-iptables] 

enabled = false 

Und ich brauche einfach falsch wahr zu ändern.

Normalerweise würde ich tun dies nur mit einem einfachen Stück sed

sed -i 's/^enabled = false/enabled = true/g' /etc/fail2ban/jail.conf 

Aber enabled = false existiert in mehreren Orten.

Ich habe versucht, awk ohne Erfolg mit

awk -F ":| " -v v1="true" -v opt="enabled" '$1 == "[ssh-iptables]" && !f {f=1}f && $1 == opt{sub("=.*","= "v1);f=0}1' /etc/fail2ban/jail.conf 

Die oben von this forum thread bezogen wurde, aber ich weiß nicht wirklich genug zu verstehen, wie es in Skripten zu verwenden, damit es funktioniert. Alles, was es zu tun scheint, ist das Äquivalent von cat /etc/fail2ban/jail.conf

Ich habe ein paar andere Skripte gefunden, die wesentlich länger sind, was nicht ideal ist, da dies mit vielen Ini-Dateien passieren wird, so hoffe ich, jemand kann mir helfen, das zu korrigieren über Code oder weisen Sie mich in die richtige Richtung.

Entschuldigung, wenn dies auf ServerFault gehört, aber da es sich um Scripting und nicht um die Feinheiten der Serverkonfiguration handelt, würde ich mir vorstellen, dass es hier besser passt.

Antwort

11

Ihr Format Unter der Annahme, dass es keine eckige Klammer Linien (wie [ssh-iptables]) innerhalb von Abschnitten, würde ich Ihre Lösung oben verwenden (mit sed), aber beschränken die Abfrage innerhalb dieser Blöcke wie folgt:

sed -i '/^\[ssh-iptables\]$/,/^\[/ s/^enabled = false/enabled = true/' /etc/fail2ban/jail.conf 

Der zusätzliche Teil am Anfang teilt der folgenden Substitutionsanweisung mit, dass sie nur zwischen der Zeile und der nächsten, die mit [ beginnt, ausgeführt wird. Es verwendet zwei reguläre Ausdrücke, die durch ein Komma getrennt sind und die Grenzen anzeigen.

+0

Dies funktioniert leider nicht. Es gibt einen Zeilenumbruch zwischen den 'tables]' und dem 'enabled =', aber das Entfernen hat keinen Unterschied gemacht. Sind Zeilenendungen usw. wichtig? –

+0

@BenSwinburne Ich habe versehentlich die Position des ersten '^' beim Kopieren kopiert. Es sollte jetzt funktionieren. –

+0

Es tut wirklich! Perfekt. Vielen Dank. –

1
awk '/^[ssh-iptables/ {ok=1} 
    ok==1 && $0="enabled = false" {print " enabled = true"; ok=0 ; next} 
    {print $0} ' infile > tmp 
    mv tmp infile 
2

Sie könnten m4 anstelle von sed in diesem Fall verwenden. Dies verwendet eine variable Ersetzung, und ich denke, dass die Datei lesbar bleibt. Ihre m4 Vorlage könnte wie folgt aussehen:

[ssh-iptables] 
enabled=SSH_IPTABLES_ENABLED 

Nun rufen Sie m4 mit den folgenden Parametern (die von einem Bash-Skript aufgerufen werden kann):

m4 -DSSH_IPTABLES_ENABLED=true input.m4 > output.ini 

oder:

m4 -DSSH_IPTABLES_ENABLED=false input.m4 > output.ini 

Dies ist eine zu einfache Art, m4 zu verwenden. Wenn Sie darüber lesen, werden Sie feststellen, dass Sie einige wirklich nette Dinge tun können (dies ist die Infrastruktur, auf der autoconf/automake ursprünglich entworfen wurde).

+0

Leider erzeugt die Standardkonfiguration von fail2ban auf CentOS 6.4 die originale 'jail.conf' Datei, die' 'enabled = true' 'hat, also müsste ich das Ersetzen von' true 'mit' SSH_IPTABLES_ENABLED' trotzdem skripten. –

+0

+1 für eine m4-Lösung. Viel Glück für jeden! – shellter

+0

Normalerweise würden Sie mit m4 eine Vorlagenbibliothek erstellen, die Sie gegen eine Konfigurationsbibliothek für Ihre verschiedenen Umgebungen ausführen und die vorhandenen Konfigurationsdateien ersetzen/ersetzen, anstatt die vorhandene Konfiguration an Ort und Stelle zu bearbeiten. Beide Wege haben Vorteile, und ich hoffe, dass Sie sich auf etwas einlassen, das Ihnen wenig Kopfzerbrechen bereitet. – PaulProgrammer

8

Wenn Sie externe Anwendungen verwenden möchten, könnten Sie an der Verwendung von crudini interessiert sein.

Beispiel:

[oauth2provider] 
module = SippoServiceOAuth2Provider 
backend[] = none 
wiface = public 

; [calldirection] 
; module = SippoServiceCallDirection 
; backend[] = none 
; wiface = internal 

Ein Standard grep wird nicht kommentiert Ausnahmen filtern.

Mit crudini Dinge für Beratung, Einstellung und ändern Sie sind einfacher:

$ crudini --get /myproject/config/main.ini oauth2provider wiface 
public 
$ crudini --get /myproject/config/main.ini calldirection wiface 
Section not found: calldirection 

Ich war auf einer bash-only-App und auf diesem Ansatz bewegt. Nur ein Vorschlag.

Grüße,

Verwandte Themen