• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

config-Dateien per Script ändern?

chakaa

Member
Hallo,

gibt es ein Programm, mit dem einzelne Werte in config-Dateien geändert werden können. Wenn's geht, keine kryptischen sed oder perl Befehle, sondern ein fertiges Progrämmchen :wink:

Es ist mir schon bewusst, dass es unter Linux keinen Standard für config-Dateien gibt, wie INI-Dateien unter Windows.
Am schönsten wäre halt, wenn ein Programm mit den wichtigsten Formaten umgehen könnte (wie xorg.conf, xinitd.conf ...)

Wofür ich das brauche?
Ich will gewisse Standardeinstellungen nicht bei jeder Neuinstallation von Hand per Editor ändern. :wink:
 

abgdf

Guru
gibt es ein Programm, mit dem einzelne Werte in config-Dateien geändert werden können. Wenn's geht, keine kryptischen sed oder perl Befehle, sondern ein fertiges Progrämmchen
Ich hab mal von so einem Programm gehört; ich glaube, es soll "YaST2" heißen.
Editor für Systemkonfiguration
Mit dem Editor zur Systemkonfiguration können Sie einige Systemeinstellungen vornehmen. Sie können ebenso YaST zur Konfiguration der Hardware- und Systemeinstellungen verwenden.
Gruß
 

whois

Ultimate Guru
Hi

Naja Linux bietet genug Editoren die das alles können. :wink:

Da brauchst du dich auch nicht erst in sowas mächtiges wie Emacs einzuarbeiten. :D

cu
 

Tobas

Newbie
mach doch backups von dein "Standard-Einstellungen" und schreib dir n shell-script, welches die dann überschreibt...

Die Config-Dateien sind viel zu individuell, als dass es dafür ein Programm giebt, welches dir alles konfiguriert.
 
OP
C

chakaa

Member
whois schrieb:
Hi

Naja Linux bietet genug Editoren die das alles können. :wink:

Da brauchst du dich auch nicht erst in sowas mächtiges wie Emacs einzuarbeiten. :D

cu

Du meinst, mit Emacs kann man sowas per Makros automatisieren? Hat der einen Makro-Recorder?
Muss ich mich wohl doch mal damit auseinandersetzen.

[seufz] an der Stelle vermisse ich echt sowas wie eine sytemweite Registry.
Da reicht ein File mit Einstellungen, und schwupp ist von Desktop über Browser bis zu Sicherheitseinstellungen alles mal grundsätzlich angepasst.

Oder eine einheitliche COM-Programmierschnittstelle wie WMI würde das Administrieren schon sehr erleichtern..

Na gut, dafür hat Linux andere Stärken :wink:
 
OP
C

chakaa

Member
mir würde vorerst schon reichen, wenn ich Werte in INI-artigen config-files (z.B. smb.conf) per Script ändern könnte.

Wie müsste denn ein sed (o.a.) Befehl aussehen, der eine Zeile einer Textdatei im Format
NAME=WERT
in zwei Variable $NAME, $WERT einliest?

Also z.B.
ZEILE=" FOO = BAR" # mit oder ohne Leerzeichen :wink:
...
Ergebnis:
$NAME=FOO
$WERT=BAR

Danke!
 
Man kann es mit Shell machen, da sie turing-vollständig ist, aber das wird immer hässlicher (mehr und mehr Code).
 

abgdf

Guru
Aha, jetzt kommen wir der Sache schon näher. Perl und Python sind am besten für sowas geeignet.
Python ist weniger kryptisch und etwas leichter zu lernen. Dieses Skript muß in Deinem "smb.conf"-Verzeichnis sein, die Werte für YOURFILE, YOURNAME, YOURWERT mußt Du ggf. anpassen:
Code:
#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-

import os

YOURFILE = "smb.conf"
YOURNAME = "NAME"
YOURWERT = "WERT"

FH = file(YOURFILE, "r")
a = FH.readlines()
FH.close()

for i in a:
    if YOURNAME in i or YOURWERT in i:
       if "=" in i:
           list = i.split("=")
           name = list[0]
           name = name.replace(" ", "")
           wert = list[1]
           wert = wert.replace(" ", "")
           wert = wert.rstrip("\n")

print "Name: " + name
print "Wert: " + wert
Näheres zu Python findest Du auf meiner Seite

http://www.angelfire.com/linux/tux25/python.html

Viele Grüße
 
OP
C

chakaa

Member
abgdf schrieb:
Python ist weniger kryptisch und etwas leichter zu lernen.

sieht ja echt mal verständlich aus :)
Super - vielen Dank!

Bei meinem ersten Test habe ich zwar gleich nen kleinen Bug gefunden. Ich habe als
YOURNAME = "write list"
genommen. Und da wird natürlich mit name.replace(" ", "") auch das Leerzeichen innerhalb des Namens entfernt, aber das kriege ich hin :wink:

edit: so scheint es zu gehen
Code:
			name = list[0]
			name = name.rstrip(name.lstrip(name))
			wert = list[1]
			wert = wert.rstrip(wert.lstrip(wert))


Ich glaube, ich nehme das als Anlass, um mich endlich mal in Python einzuarbeiten..
 

abgdf

Guru
Die ist wohl eher für C ...

Aber - natürlich - hat Python eine Entsprechung: Einfach mal auf der Konsole
Code:
pydoc ConfigParser
eingeben. Damit würde ich aber erst arbeiten, wenn ich schon etwas mehr Python-Grundlagen hätte. Andererseits hindert Dich niemand (außer der möglichen Frustration :)), es auch ohne solche Grundlagen zu probieren.

Viele Grüße
 
jengelh schrieb:
Man kann es mit Shell machen, da sie turing-vollständig ist, aber das wird immer hässlicher (mehr und mehr Code).

Hmm, muss ich das glauben ?

Das sieht für mich nicht häßlich aus:
Code:
IFS== read NAME WERT <datei

Als ganzes Beispiel:
Code:
#echo $NAME $WERT

#cat datei
OTTO=XYZ
#IFS== read NAME WERT <datei
#echo $NAME
OTTO
#echo $WERT
XYZ

Haveaniceday
 
IFS steht für Input Field Separator.
Damit wird der zeilenweise input über "=" in einzelne Felder getrennt.

IFS ist aber auch eine Variable. Und die kann man einfach in einer (Befehls)Zeile
einfach mit VARIABLE=WERT COMMAND vor das Kommando COMMAND
setzen.
Im Beispiel sollte man anschliessend IFS mit IFS="\n" wieder zurück setzen.

Haveaniceday
 

abgdf

Guru
@chakaa:

Ok, ich gebe Dir dann noch mal ein Python-Beispiel:
Erstmal: Mit "smb.conf" gibt es ein Problem: Es ist nicht standardkonform, da es jeweils ein "\t" (Tabulator) vor jeder Option hat :evil:.
Aber, wenn "smb.conf" so aussieht:
Code:
# smb.conf is the main Samba configuration file. You find a full commented
# version at /usr/share/doc/packages/samba/examples/smb.conf.SUSE if the
# samba-doc package is installed.
# Date: 2005-09-05
[global]
workgroup = TUX-NET
printing = cups
printcap name = cups
printcap cache time = 750
cups options = raw
map to guest = Bad User
include = /etc/samba/dhcp.conf
logon path = \\%L\profiles\.msprofile
logon home = \\%L\%U\.9xprofile
logon drive = P:
[homes]
comment = Home Directories
valid users = %S
browseable = No
read only = No
inherit acls = Yes
[profiles]
comment = Network Profiles Service
path = %H
read only = No
store dos attributes = Yes
create mask = 0600
directory mask = 0700
[users]
comment = All users
path = /home
read only = No
inherit acls = Yes
veto files = /aquota.user/groups/shares/
[groups]
comment = All groups
path = /home/groups
read only = No
inherit acls = Yes
[printers]
comment = All Printers
path = /var/tmp
printable = Yes
create mask = 0600
browseable = No
[print$]
comment = Printer Drivers
path = /var/lib/samba/drivers
write list = @ntadmin root
force group = ntadmin
create mask = 0664
directory mask = 0775
dann läuft folgendes Skript:
Code:
#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-

import ConfigParser

c = ConfigParser.ConfigParser()
c.read("smb.conf")

print
print "The sections and their options are:"

secs = c.sections()

for i in secs:
    print i
    opts = c.options(i)

    for u in opts:
        print "\t" + u
print
Du schaffst es ! :lol:

Viele Grüße
 
OP
C

chakaa

Member
haveaniceday schrieb:
IFS ist aber auch eine Variable. Und die kann man einfach in einer (Befehls)Zeile
einfach mit VARIABLE=WERT COMMAND vor das Kommando COMMAND
setzen.

darauf wäre ich jetzt nie gekommen.

Aber wofür ist denn diese Syntax eigentlich gedacht?
Ich meine, wo ist der Vorteil, das in dieselbe Zeile zu schreiben?
Irgendwas werden sich die bash-Programmierer ja dabei gedacht haben.
 
OP
C

chakaa

Member
abgdf schrieb:
Erstmal: Mit "smb.conf" gibt es ein Problem: Es ist nicht standardkonform, da es jeweils ein "\t" (Tabulator) vor jeder Option hat :evil:.

da müsste man wohl irgendeinen kleinen Filter vorschalten.
Z.B. ein Python-Progrämmchen, das jede Zeile mit lstrip() behandelt.
Aber sicher gibt es dafür schon etliche fertige Tools.

Danke für das Code-Beispiel. Sieht elegant aus.

abgdf schrieb:

wem sagst du das :mrgreen:
 
Oben