Script zu bearbeiten einer conf Datei

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von satriani, 14.03.2013.

  1. #1 satriani, 14.03.2013
    Zuletzt bearbeitet: 14.03.2013
    satriani

    satriani SysLion

    Dabei seit:
    20.04.2011
    Beiträge:
    39
    Zustimmungen:
    0
    Script zum bearbeiten einer conf Datei

    Hallo liebe Leute,

    ich baue mir ein Script, der über eine Funktion verfügt zum verwalten einer Konfigurationsdatei. Hier der Code:
    Code:
    #!/bin/sh
    
    jail_path=/srv/mysql
    jail_ip=127.10.10.1
    jail_name=mysql
    
    host_jail_conf="${jail_name} {
    path = ${jail_path};
    mount.devfs;
    allow.mount;
    mount;
    host.hostname = ${jail_name};
    ip4.addr = ${jail_ip};
    interface = lo1;
    exec.start = \"/bin/sh /etc/rc\";
    exec.stop = \"/bin/sh /etc/rc.shutdown\";
    }
    "
            if [ -z "$(grep -ir '${host_jail_conf}' /etc/jail.conf)" ]; then
              echo "$host_jail_conf" >> /etc/jail.conf
            else
              read -r -p "Settings allredy exist. Do you want to remove this settings for $jail_name? [Y/N] " response
              case $response in
    [yY][eE][sS][jJ]|[yY])
    sed -i "" "s/$host_jail_conf//g" /etc/jail.conf
    exit
    ;;
    [nN]|[nN])
    echo "Good bye!"
    exit
    ;;
      esac
            fi
    Leider tut es nicht was es soll. Nämlich, wie man aus dem Code entnehmen kann, wenn $host_jail_conf in der /etc/jail.conf bereits vorhanden ist, dann Vorschlagen ob der komplette Abschnitt $host_jail_conf aus der /etc/jail.conf entfent werden soll. Leider wir es nicht gefragt nach der Ausführung, sondern jedes mal mit weiterem $host_jail_conf ergänzt. Was ist falsch an dem Code?

    Danke im Voraus.
    Gruß.
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Spröde, 14.03.2013
    Spröde

    Spröde Alter Sack

    Dabei seit:
    22.01.2012
    Beiträge:
    173
    Zustimmungen:
    0
    Die Vari wird wegen der einfachen Anführungszeichen nicht aufgelöst. Mit Doppelten sollte es gehen (falls grep die ganzen Sonderzeichen in dem mehrzeiligen Suchmuster nicht anders interpretiert, als vorgesehen).
     
  4. #3 satriani, 14.03.2013
    satriani

    satriani SysLion

    Dabei seit:
    20.04.2011
    Beiträge:
    39
    Zustimmungen:
    0
    Recht haste Spröde, danke dafür. :]
    Nun will er nicht überschreiben bzw. entfernen, irgendwas ist faul am
    Code:
    sed -i "" "s/$host_jail_conf//g" /etc/jail.conf
    Ich mach mich auf die Suche :)
     
  5. #4 tgruene, 15.03.2013
    tgruene

    tgruene Routinier

    Dabei seit:
    02.02.2012
    Beiträge:
    418
    Zustimmungen:
    0
    So gut kenne ich sed nicht, aber wuerde sed bei dieser Syntax nicht den leeren String als das Muster und den zweiten dann bereits als Dateinamen interpretieren? Ich wuerde es mit
    Code:
    sed -i  "s/$host_jail_conf//g" /etc/jail.conf
    versuchen.
     
  6. #5 satriani, 15.03.2013
    satriani

    satriani SysLion

    Dabei seit:
    20.04.2011
    Beiträge:
    39
    Zustimmungen:
    0
    Danke tgruene,

    doch leider kein Erfolg.
    Im Netz kann ich dazu auch nichts finden, wie man mehrere Zeilen mit sed auf einmal ändern kann.
     
  7. #6 Gast123, 15.03.2013
    Gast123

    Gast123 Guest

    Ich nehme an, dass in der Variable
    Code:
    $host_jail_conf
    in
    Code:
    sed -i  "s/$host_jail_conf//g" /etc/jail.conf
    ein oder mehrere Slashes ("/") vorkommen, welche du im sed-Statement ja als Separatoren definiert hast.
    Da musst du wohl einen anderen Seperator wählen, oder die Slashes escapen.

    MfG

    Schard
     
  8. #7 Gast123, 15.03.2013
    Gast123

    Gast123 Guest

    PS:
    Jetzt benutzt du wohl
    Code:
     sed -j
    statt, wie von tgruene vorgeschlagen
    Code:
    sed -i
    Schard
     
  9. #8 satriani, 15.03.2013
    satriani

    satriani SysLion

    Dabei seit:
    20.04.2011
    Beiträge:
    39
    Zustimmungen:
    0
    Ja, du hast recht. Wie man aus dem Code im ersten post entnehmen kann ist die Variable:
    Code:
    host_jail_conf="${jail_name} {
    path = ${jail_path};
    mount.devfs;
    allow.mount;
    mount;
    host.hostname = ${jail_name};
    ip4.addr = ${jail_ip};
    interface = lo1;
    exec.start = \"/bin/sh /etc/rc\";
    exec.stop = \"/bin/sh /etc/rc.shutdown\";
    }
    "
    Die auch Slashes beinhaltet. Ich kann die Slashes nicht ohne weiteres escapen, mit einem anderen Separator zB.
    Code:
    sed -i "" "s@$host_jail_conf@@g" /etc/jail.conf
    funktionierts auch nicht :(
     
  10. #9 floyd62, 15.03.2013
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    Hi,

    statt mit sed auf den ganzen Eintrag für ein Jail loszugehen, könntest du auch einfach versuchen, den Absatz, der mit dem Jail-Namen beginnt bis zur nächsten Leerzeile löschen:
    Code:
    sed -i "/${jail_name} {/,/^$/d' /etc/jail.conf
    
    Ich denke, 'sed' wird immer etwas unhandlich, wenn er Strings verarbeiten soll, die über mehrere Zeilen gehen ;)

    Gruss, A.
     
  11. #10 satriani, 15.03.2013
    satriani

    satriani SysLion

    Dabei seit:
    20.04.2011
    Beiträge:
    39
    Zustimmungen:
    0
    Danke floyd62,
    aber ich glaube da hat sich ein Fehler eingeschlichen
    Code:
    sed -i [COLOR="#FF0000"][B]"[/B][/COLOR]/${jail_name} {/,/^$/d[COLOR="#FF0000"][B]'[/B][/COLOR] /etc/jail.conf
    so
    Code:
    sed -i '/'${jail_name}' {/,/^$/d' /etc/jail.conf
    oder so
    Code:
    sed -i "/${jail_name} {/,/^$/d" /etc/jail.conf
    ergibt das
    Das muss nicht unbedingt sed sein, vielleicht hast du bessere Alternativen :)
     
  12. #11 floyd62, 16.03.2013
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    Hi,

    du hast natürlich recht - ich wollte double quotes ("..."), weil sonst die Shell ja die Variable nicht auswertet.

    Die Meldung mit "invalid command code j" kann ich hier nicht nachvollziehen.

    Ich habe hier noch ein bisschen gebastelt, und bei mir scheint das Folgende jetzt zu laufen:
    Code:
    #!/bin/sh
    
    jail_path=/srv/mysql
    jail_ip=127.10.10.1
    jail_name=mysql
    
    CONFIG=/var/tmp/jail.conf
    
    host_jail_conf="${jail_name} {
    path = ${jail_path};
    mount.devfs;
    allow.mount;
    mount;
    host.hostname = ${jail_name};
    ip4.addr = ${jail_ip};
    interface = lo1;
    exec.start = \"/bin/sh /etc/rc\";
    exec.stop = \"/bin/sh /etc/rc.shutdown\";
    }
    "
    
    if grep -irq "^${host_jail_conf} " $CONFIG; then
            read -r -p "Settings already exist. Do you want to remove the settings for $jail_name? [Y/N] " response
            case $response in
            [Yyj])
                    sed -i "/${jail_name}/,/^$/d" $CONFIG
                    exit
                    ;;
            [nN])
                    echo "Good bye!"
                    exit
                    ;;
            esac
    else
            echo "$host_jail_conf" >>$CONFIG
            echo "ADDED"
    fi
    
    Zur Erläuterung: in der "if grep ..." Abfrage interessiert mich überhaupt nicht, was grep findet, sondern nur ob überhaupt, d.h. der Exit-Status, daher verwende ich "-q". Und nach der Bestätigung lösche ich den Absatz für den Jail "${jail_name}" (d.h. alle solchen Absätze) mit dem sed-Befehl wie oben angedeutet.

    Hoffe, das hilft dir weiter - Gruss, A.
     
  13. #12 satriani, 16.03.2013
    satriani

    satriani SysLion

    Dabei seit:
    20.04.2011
    Beiträge:
    39
    Zustimmungen:
    0
    Ich verstehe es nicht, liegt es vielleicht daran, dass wir verschiedene Systeme benutzen?
    FreeBSD 9.1-RELEASE #0 r243825
     
  14. #13 floyd62, 16.03.2013
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    Hi,

    kann gut sein - habe hier auf Linux getestet; weiss nicht, ob der FreeBSD-sed die -i-Option genau so verarbeitet wie GNU-sed unter Linux; als Workaround könntest du die sed -Zeile auch einfach ersetzen mit etwas wie
    Code:
    sed  "/${jail_name}/,/^$/d" <$CONFIG >$CONFIG.$$
    cmp -s $CONFIG $CONFIG.$$ && { echo $CONFIG unchanged; rm -f $CONFIG.$$; } || { mv $CONFIG $CONFIG.OLD; mv $CONFIG.$$ $CONFIG; }
    
    Das Ganze jetzt natürlich ungetestet und rein theoretisch ...

    Gruss, A.
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #14 satriani, 16.03.2013
    satriani

    satriani SysLion

    Dabei seit:
    20.04.2011
    Beiträge:
    39
    Zustimmungen:
    0
    ungetestet und rein theoretisch? :think:
    Dafür erfüllt es seinen Zweck, also ich danke dir vielmals, darauf wäre ich nie gekommen :respekt:
     
  17. #15 satriani, 16.03.2013
    satriani

    satriani SysLion

    Dabei seit:
    20.04.2011
    Beiträge:
    39
    Zustimmungen:
    0
    Ich habe etwas aufgeräumt
    Code:
    #!/bin/sh
    
    jail_path=/srv/mysql
    jail_ip=127.10.10.1
    jail_name=mysql
    
    CONFIG=/etc/jail.conf
    
    host_jail_conf="${jail_name} {
    path = ${jail_path};
    mount.devfs;
    allow.mount;
    mount;
    host.hostname = ${jail_name};
    ip4.addr = ${jail_ip};
    interface = lo1;
    exec.start = \"/bin/sh /etc/rc\";
    exec.stop = \"/bin/sh /etc/rc.shutdown\";
    }
    "
    
    if grep -irq "^${host_jail_conf} " $CONFIG; then
            read -r -p "Settings already exist. Do you want to remove the settings for $jail_name? [Y/N] " response
            case $response in
            [Yyj])
                    sed -i "" "/${jail_name}/,/^$/d" $CONFIG
                    exit
                    ;;
            [nN])
                    echo "Good bye!"
                    exit
                    ;;
            esac
    else
            echo "$host_jail_conf" >>$CONFIG
            echo "ADDED"
    fi
    Funktioniert ganz gut, bis auf das grep Problem. Funktioniert leider nicht so wie es soll.
    Ändern sich die Variablen jail_path, jail_ip und jail_name, so wird es nicht erkannt und schlägt vor die conf zu bereinigen. :think:
     
Thema:

Script zu bearbeiten einer conf Datei

Die Seite wird geladen...

Script zu bearbeiten einer conf Datei - Ähnliche Themen

  1. Bräuchte Hilfe bei Backupscript mittels Bash und cronjob

    Bräuchte Hilfe bei Backupscript mittels Bash und cronjob: Es soll für bestimmte Ordner Archivierung aller Dateien(Logfiles), die älter als 30 Tage sind machen. Am besten einmal täglich nachts irgendwann....
  2. Bashscript aus Debian6 läuft nicht auf Debian7

    Bashscript aus Debian6 läuft nicht auf Debian7: Hallo an alle, nachdem ich ein Skript von squeeze auf wheezy kopiert habe und ausführte, erschienen gleich wilde Fehlermeldungen, nach denen ich...
  3. Shell Script Problem

    Shell Script Problem: Hallo zusammen, ich arbeite momentan mit einem Plagiat Tool, die ich über Git Bash ausführe. Es wird im Endeffekt ein Link generiert, die ich...
  4. Externes Programm mit Script ausführen?

    Externes Programm mit Script ausführen?: Hallo, ich würde gern ein Script zum klonen von festplatten schreiben z.B. mit dem Programm Mondo Rescue. Ist es möglich externen Programmen...
  5. sh Script zum Autostart

    sh Script zum Autostart: hallo liebe Mitglieder, wenn ich unter Linux eins meiner Shell Skripte im Autostart haben will nutze ich immer die @reboot Funktion im crontab....