Как урленкодировать данные для команды curl? - PullRequest
274 голосов
/ 17 ноября 2008

Я пытаюсь написать bash-скрипт для тестирования, который принимает параметр и отправляет его через curl на веб-сайт. Мне нужно URL кодировать значение, чтобы убедиться, что специальные символы обрабатываются правильно. Каков наилучший способ сделать это?

Вот мой основной сценарий:

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

Ответы [ 30 ]

14 голосов
/ 01 августа 2013

Это может быть лучшим:

after=$(echo -e "$before" | od -An -tx1 | tr ' ' % | xargs printf "%s")
10 голосов
/ 11 января 2011
url=$(echo "$1" | sed -e 's/%/%25/g' -e 's/ /%20/g' -e 's/!/%21/g' -e 's/"/%22/g' -e 's/#/%23/g' -e 's/\$/%24/g' -e 's/\&/%26/g' -e 's/'\''/%27/g' -e 's/(/%28/g' -e 's/)/%29/g' -e 's/\*/%2a/g' -e 's/+/%2b/g' -e 's/,/%2c/g' -e 's/-/%2d/g' -e 's/\./%2e/g' -e 's/\//%2f/g' -e 's/:/%3a/g' -e 's/;/%3b/g' -e 's//%3e/g' -e 's/?/%3f/g' -e 's/@/%40/g' -e 's/\[/%5b/g' -e 's/\\/%5c/g' -e 's/\]/%5d/g' -e 's/\^/%5e/g' -e 's/_/%5f/g' -e 's/`/%60/g' -e 's/{/%7b/g' -e 's/|/%7c/g' -e 's/}/%7d/g' -e 's/~/%7e/g')

это закодирует строку внутри $ 1 и выведет ее в $ url. хотя вам не нужно помещать его в переменную, если хотите. Кстати, не включает sed для tab, думал, что это превратит его в пробелы

8 голосов
/ 01 января 2017

Вот решение Bash, которое не вызывает никаких внешних программ:

uriencode() {
  s="${1//'%'/%25}"
  s="${s//' '/%20}"
  s="${s//'"'/%22}"
  s="${s//'#'/%23}"
  s="${s//'$'/%24}"
  s="${s//'&'/%26}"
  s="${s//'+'/%2B}"
  s="${s//','/%2C}"
  s="${s//'/'/%2F}"
  s="${s//':'/%3A}"
  s="${s//';'/%3B}"
  s="${s//'='/%3D}"
  s="${s//'?'/%3F}"
  s="${s//'@'/%40}"
  s="${s//'['/%5B}"
  s="${s//']'/%5D}"
  printf %s "$s"
}
7 голосов
/ 20 июня 2010

Для тех из вас, кто ищет решение, не требующее Perl, вот то, которое требует только hexdump и awk:

url_encode() {
 [ $# -lt 1 ] && { return; }

 encodedurl="$1";

 # make sure hexdump exists, if not, just give back the url
 [ ! -x "/usr/bin/hexdump" ] && { return; }

 encodedurl=`
   echo $encodedurl | hexdump -v -e '1/1 "%02x\t"' -e '1/1 "%_c\n"' |
   LANG=C awk '
     $1 == "20"                    { printf("%s",   "+"); next } # space becomes plus
     $1 ~  /0[adAD]/               {                      next } # strip newlines
     $2 ~  /^[a-zA-Z0-9.*()\/-]$/  { printf("%s",   $2);  next } # pass through what we can
                                   { printf("%%%s", $1)        } # take hex value of everything else
   '`
}

Сшито из нескольких мест в сети и некоторых локальных проб и ошибок. Отлично работает!

6 голосов
/ 01 февраля 2012

Использование php из скрипта оболочки:

value="http://www.google.com"
encoded=$(php -r "echo rawurlencode('$value');")
# encoded = "http%3A%2F%2Fwww.google.com"
echo $(php -r "echo rawurldecode('$encoded');")
# returns: "http://www.google.com"
  1. http://www.php.net/manual/en/function.rawurlencode.php
  2. http://www.php.net/manual/en/function.rawurldecode.php
6 голосов
/ 26 ноября 2012

uni2ascii очень удобно:

$ echo -ne '你好世界' | uni2ascii -aJ
%E4%BD%A0%E5%A5%BD%E4%B8%96%E7%95%8C
6 голосов
/ 17 ноября 2008

Если вы не хотите зависеть от Perl, вы также можете использовать sed. Это немного грязно, так как каждый персонаж должен избегаться индивидуально. Создайте файл со следующим содержимым и назовите его urlencode.sed

s/%/%25/g
s/ /%20/g
s/ /%09/g
s/!/%21/g
s/"/%22/g
s/#/%23/g
s/\$/%24/g
s/\&/%26/g
s/'\''/%27/g
s/(/%28/g
s/)/%29/g
s/\*/%2a/g
s/+/%2b/g
s/,/%2c/g
s/-/%2d/g
s/\./%2e/g
s/\//%2f/g
s/:/%3a/g
s/;/%3b/g
s//%3e/g
s/?/%3f/g
s/@/%40/g
s/\[/%5b/g
s/\\/%5c/g
s/\]/%5d/g
s/\^/%5e/g
s/_/%5f/g
s/`/%60/g
s/{/%7b/g
s/|/%7c/g
s/}/%7d/g
s/~/%7e/g
s/      /%09/g

Чтобы использовать это, сделайте следующее.

STR1=$(echo "https://www.example.com/change&$ ^this to?%checkthe@-functionality" | cut -d\? -f1)
STR2=$(echo "https://www.example.com/change&$ ^this to?%checkthe@-functionality" | cut -d\? -f2)
OUT2=$(echo "$STR2" | sed -f urlencode.sed)
echo "$STR1?$OUT2"

Это разделит строку на часть, которая нуждается в кодировании, и часть, которая в порядке, закодирует часть, которая нуждается в этом, а затем сшит обратно.

Вы можете поместить это в скрипт sh для удобства, может быть, для этого потребуется параметр для кодирования, поместить его на свой путь и затем вы можете просто вызвать:

urlencode https://www.exxample.com?isThisFun=HellNo

источник

5 голосов
/ 21 января 2015

Вы можете эмулировать javascript encodeURIComponent в Perl. Вот команда:

perl -pe 's/([^a-zA-Z0-9_.!~*()'\''-])/sprintf("%%%02X", ord($1))/ge'

Вы можете установить это как псевдоним bash в .bash_profile:

alias encodeURIComponent='perl -pe '\''s/([^a-zA-Z0-9_.!~*()'\''\'\'''\''-])/sprintf("%%%02X",ord($1))/ge'\'

Теперь вы можете подключиться к encodeURIComponent:

$ echo -n 'hèllo wôrld!' | encodeURIComponent
h%C3%A8llo%20w%C3%B4rld!
5 голосов
/ 26 февраля 2015

Простой вариант PHP:

echo 'part-that-needs-encoding' | php -R 'echo urlencode($argn);'
5 голосов
/ 14 ноября 2014

Вопрос в том, чтобы сделать это в bash, и нет необходимости в python или perl, так как на самом деле существует одна команда, которая делает именно то, что вы хотите - "urlencode".

value=$(urlencode "${2}")

Это также намного лучше, так как приведенный выше ответ perl, например, не правильно кодирует все символы. Попробуйте это с длинной чертой, которую вы получаете от Word, и вы получите неправильную кодировку.

Обратите внимание, что для этой команды вам нужно установить "gridsite-clients".

...