Die Bash hat selbst kein
urldecode oder
urlencode. Das kann aber recht einfach nachgebaut werden. Ist php installiert, hilft der Umweg über den Aufruf der PHP-Funktionen mit "
php -r" (=direktes Ausführen von PHPcode in der Shell ohne Apache o.ä.).
Beispiel zum Encodieren:
echo $( php -r "echo urlencode('Start: #1, Zeichen {13/24} Ende();');"; )
Ergebnis: Start%3A+%231%2C+Zeichen+%7B13%2F24%7D+Ende%28%29%3B
Beispiel zum Decodieren:
echo $( php -r "echo urldecode('Start%3A+%231%2C+Zeichen+%7B13%2F24%7D+Ende%28%29%3B');"; )
Ergebnis: Start: #1, Zeichen {13/24} Ende();
Das funktioniert, ist aber nicht besonders komfortabel. Wir wissen uns aber zu helfen:
Ein kleines Bash Wrapperskript sorgt für mehr Bequemlichkeit. Hier ein Beispiel für urlencode. Legt das irgendwo als "urlencode.sh" in euren Pfad und macht es ausführbar.
#!/bin/bash
echo $( php -r "echo urlencode(\"$1\");"; )
Jetzt müsst ihr nur mehr
urlencode.sh 'string zum encodieren'
aufrufen.
Was aber tun, wenn PHP nicht installiert ist? Da hilft
sed beim Decodieren.
Die Bash, bzw. das Bashbuiltin "
echo -e" kann hexadezimal dargestellte Zeichen umwandeln, wenn sie mit
\x eingeleitet werden.
echo -e '\x22\xC3\xB6\x22'
Ergebnis: "ö"
Das bedeutet, wir müssen in den URL-Strings einfach nur die % Zeichen durch \x ersetzen und das dann an "echo -e" übergeben:
echo '%22%C3%B6%22' | echo -e $(sed 's/%/\\x/g')
Zu beachten: der Backslash im sed-Kommando muss wiederum durch Backslash escaped werden.
Zusätzlich müssen wir auch noch das + Zeichen durch Leerzeichen ersetzen:
echo '%22+%C3%B6+%22' | echo -e $(sed 's/+/ /g; s/%/\\x/g')
Ergebnis: " ö "
Aber wo bleibt da jetzt der Komfort?
Kommt auch noch, wieder als Bashskript:
#!/bin/bash
# urldecode mit der bash und sed
# by xela
self=$( basename $0 )
urldecode(){
echo -e "$(sed 's/+/ /g; s/%/\\x/g')"
}
if [ $# -eq 1 ]
then
if [ -f $1 ]
then
# Argument ist eine Datei
cat $1 | urldecode
else
# Argument ist ein String
echo $1 | urldecode
fi
else
# Hilfetext
echo -e "Usage: \n$self URL-String\n$self Datei"
fi
exit 0
Das Skript kann sowohl mit Strings als auch mit Dateien als Argument umgehen. Ein weiterer Vorteil dieses Skriptes ist, dass es sehr schnell ist (sed ist immer schnell). Auch große Dateien sind kein Problem.
Das Nachbauen von url
encode mit Bash und sed ist aufwändiger.
Aber natürlich hat das schon jemand gemacht, also ein sed-Skript mit Ersetzungstabelle:
www.unix.com/shell-programming-scripting/59936-url-encoding.html
Ein anderer Ansatz ist das Ersetzen mit
awk, dieses Skript liest ausschließlich Dateien ein, direktes Übergeben von Strings ist nicht vorgesehen:
www.shelldorado.com/scripts/cmds/urlencode
Hoppla,
perl darf ich nicht vergessen. Encode und decode über das Ausführen von perl in der Shell:
echo 'Start: #1, Zeichen {13/24} Ende();' | perl -MURI::Escape -lne 'print uri_escape($_)'
Ergebnis: Start%3A%20%231%2C%20Zeichen%20%7B13%2F24%7D%20Ende()%3B
Hm. Die runden Klammern werden hier nicht escaped.
Andersrum, also decodieren:
echo '%20%7B13%2F24%7D%20Ende()%3B' | perl -MURI::Escape -lne 'print uri_unescape($_)'
Zum Abschluss noch eine Methode für Unerschrockene: einfach alles als HEX ausgeben mit
od, gefunden auf:
linux.derkeiler.com/Newsgroups/comp.os.linux.misc/2005-10/1193.html