PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : anfälliges Shellscript (Parameter-Parsing)



rabby
28-01-2008, 14:26
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

Aqualung
28-01-2008, 19:43
eine kleine Lösung wäre (zumindest für die slashes):



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

jan61
28-01-2008, 20:35
Moin,


...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:
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 ;-)
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.