Anzeige:
Ergebnis 1 bis 3 von 3

Thema: anfälliges Shellscript (Parameter-Parsing)

  1. #1
    Registrierter Benutzer
    Registriert seit
    17.03.2006
    Beiträge
    14

    anfälliges Shellscript (Parameter-Parsing)

    Hallo,

    habe ein Shellscript gebastelt, was mit sed eine Ersetzung durchführen soll.
    Was ersetzt werden soll, ist vorgegeben. Wodurch es ersetzt wird, soll durch den übergebenen Parameter klar werden, wenn das Script aufgerufen wird.
    Da diese Ersetzung jedoch auch Leerzeichen, Klammern etc. enthalten darf, kommt es zu Problemen beim Aufruf
    sed -i -e 's/^.*\+hide-user-agent.*/\+hide-user-agent{'$1'} \\/' /etc/privoxy/default.action
    Wenn das Script nun z.B. so aufgerufen wird, krachts:
    ./script.sh bla/bla
    so geht es wiederum:
    ./script.sh bla\\\\/bla

    Mit runden Klammern hat es ebenso Probleme und wahrscheinlich noch mit weiteren Sonderzeichen

    Deshalb wüsste ich gerne, wie sich das Problem lösen lässt bzw. ob es sowas wie magic_quotes/slashes für Shell Scripte gibt, damit mir die sed Zeile nicht ständig "zerbricht".

    Danke

  2. #2
    Registrierter Benutzer Avatar von Aqualung
    Registriert seit
    28.01.2008
    Beiträge
    14
    eine kleine Lösung wäre (zumindest für die slashes):

    Code:
    sed -i -e 's@^.*\+hide-user-agent.*@\+hide-user-agent{'$1'} \\@' /etc/privoxy/default.action
    Mit anderen Special-Chars zerbricht das Ding immer noch - vielleicht mit perl versuchen ...

    HTH Aqualung

  3. #3
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von rabby Beitrag anzeigen
    ...Deshalb wüsste ich gerne, wie sich das Problem lösen lässt bzw. ob es sowas wie magic_quotes/slashes für Shell Scripte gibt, damit mir die sed Zeile nicht ständig "zerbricht".
    Ein "Quotierungs"-Programm auf Shell-Ebene ist mir nicht bekannt, aber das Problem ist IMHO recht einfach zu lösen. So viele Zeichen gibt es nicht, die im Ersetzungstext Ärger machen können. Das Slash-Problem kannst Du abfangen, indem Du als Trennzeichen für den s-Operator ein anderes Zeichen nimmst, dass im Ersetzungstext nicht vorkommen kann. Ansonsten fällt mir eigentlich nur der Backslash ein, der Ärger machen könnte, den musst Du bei der Parametereingabe entwerten:
    Code:
    jan@jack:~/tmp> e='bla/bla()+[]-*? {}\\"`'
    jan@jack:~/tmp> echo "alle meine entchen" | sed 's| meine | {'"$e"'} \\|'
    alle {bla/bla()+[]-*? {}\"`} \entchen
    Eine andere Möglichkeit ist awk, hier wird allerdings das Entwerten des Backslash wieder zur Orgie ;-)
    Code:
    jan@jack:~/tmp> e='bla/bla()+[]-*? {}\\\\\"`'
    jan@jack:~/tmp> echo "alle meine entchen" | awk '{print gensub(" meine "," {'"$e"'} \\\\","g"); }'
    alle {bla/bla()+[]-*? {}\"`} \entchen
    Jan

    EDIT: Was bezweckst Du mit der -e-Option im sed?

    Nochmal ich: Ich habe gerade gesehen, dass Aqualung bereits die Variante für die Begrenzer im sed vorgeschlagen hatte. Der Trick, um den Rest der shell-relevanten Sonderzeichen durchzukriegen, sind die "" um die Variable herum.
    Geändert von jan61 (28-01-2008 um 21:08 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •