538 Stimmen

Wie zu urlencode Daten für curl Befehl?

Ich versuche, ein Bash-Skript zum Testen zu schreiben, das einen Parameter nimmt und ihn über curl an eine Website sendet. Ich muss den Wert url-codieren, um sicherzustellen, dass Sonderzeichen richtig verarbeitet werden. Was ist der beste Weg, dies zu tun?

Hier ist mein bisheriges Grundskript:

#!/bin/bash
host=${1:?'bad host'}
value=$2
shift
shift
curl -v -d "param=${value}" http://${host}/somepath $@

76voto

josch Punkte 6178

Der Vollständigkeit halber: viele Lösungen mit sed o awk übersetzen nur einen speziellen Satz von Zeichen und sind daher von der Codegröße her recht groß und übersetzen auch nicht andere Sonderzeichen, die kodiert werden sollten.

Eine sichere Art der Urlencodierung wäre es, einfach jedes einzelne Byte zu codieren - auch die, die erlaubt wären.

echo -ne 'some random\nbytes' | xxd -plain | tr -d '\n' | sed 's/\(..\)/%\1/g'

xxd sorgt hier dafür, dass die Eingabe als Bytes und nicht als Zeichen behandelt wird.

éditer :

xxd kommt mit dem vim-common-Paket in Debian und ich war gerade auf einem System, wo es nicht installiert war und ich wollte es nicht installieren. Die Alternative ist die Verwendung von hexdump aus dem bsdmainutils-Paket in Debian. Nach dem folgenden Diagramm sollten bsdmainutils und vim-common eine ungefähr gleiche Wahrscheinlichkeit haben, installiert zu werden:

http://qa.debian.org/popcon-png.php?packages=vim-common%2Cbsdmainutils&show_installed=1&want_legend=1&want_ticks=1

aber dennoch hier eine Version, die hexdump anstelle von xxd und ermöglicht die Vermeidung der tr anrufen:

echo -ne 'some random\nbytes' | hexdump -v -e '/1 "%02x"' | sed 's/\(..\)/%\1/g'

68voto

sandro Punkte 615

Ich finde es in Python besser lesbar:

encoded_value=$(python3 -c "import urllib.parse; print urllib.parse.quote('''$value''')")

das dreifache ' stellt sicher, dass einfache Anführungszeichen im Wert nicht schaden. urllib ist in der Standardbibliothek. Es funktioniert zum Beispiel für diese verrückte (reale Welt) url:

"http://www.rai.it/dl/audio/" "1264165523944Ho servito il re d'Inghilterra - Puntata 7

37voto

blueyed Punkte 25926

Ich habe das folgende Snippet als nützlich empfunden, um es in eine Kette von Programmaufrufen einzufügen, bei denen URI::Escape möglicherweise nicht installiert ist:

perl -p -e 's/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg'

( source )

28voto

Piotr Czapla Punkte 24266

Wenn Sie Folgendes ausführen möchten GET Anfrage und verwenden Sie reines Curl, fügen Sie einfach --get zu @Jacob's Lösung.

Hier ist ein Beispiel:

curl -v --get --data-urlencode "access_token=$(cat .fb_access_token)" https://graph.facebook.com/me/feed

17voto

chenzhiwei Punkte 431

Dies ist vielleicht die beste:

after=$(echo -e "$before" | od -An -tx1 | tr ' ' % | xargs printf "%s")

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X