Как к urlencode данным для вихревой команды?

298
задан Mateusz Piotrowski 26 July 2017 в 04:06
поделиться

7 ответов

Используйте -корреляцию данных; из -корреляцию данных:

-это данные, аналогичные другим опциям -данные, за исключением того, что это выполняет кодирование URL. Для соответствия CGI, часть <данные> должна начинаться с имени, за которым следует разделитель и спецификация контента.

Пример использования:

curl \
    --data-urlencode "paramName=value" \
    --data-urlencode "secondParam=value" \
    http://example.com

См. man page для получения дополнительной информации.

Для этого требуется -скручивание 7.18.0 или более новое (выпущено в январе 2008 года). Используйте curl -V, чтобы проверить, какая версия у вас есть.

.
358
ответ дан 23 November 2019 в 01:29
поделиться

Если Вы не хотите зависеть от 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

источник

6
ответ дан thecoshman 23 November 2019 в 01:29
поделиться

Используйте Perl URI::Escape модуль и uri_escape функция во второй строке Вашего сценария удара:

...

value="$(perl -MURI::Escape -e 'print uri_escape($ARGV[0]);' "$2")"
...

Редактирование: Решают проблемы заключения в кавычки, как предложил Chris Johnsen в комментариях. Спасибо!

93
ответ дан dubek 23 November 2019 в 01:29
поделиться

Прямая ссылка на awk версию: http://www.shelldorado.com/scripts/cmds/urlencode
Я использовал его в течение многих лет, и это работает как очарование

:
##########################################################################
# Title      :  urlencode - encode URL data
# Author     :  Heiner Steven (heiner.steven@odn.de)
# Date       :  2000-03-15
# Requires   :  awk
# Categories :  File Conversion, WWW, CGI
# SCCS-Id.   :  @(#) urlencode  1.4 06/10/29
##########################################################################
# Description
#   Encode data according to
#       RFC 1738: "Uniform Resource Locators (URL)" and
#       RFC 1866: "Hypertext Markup Language - 2.0" (HTML)
#
#   This encoding is used i.e. for the MIME type
#   "application/x-www-form-urlencoded"
#
# Notes
#    o  The default behaviour is not to encode the line endings. This
#   may not be what was intended, because the result will be
#   multiple lines of output (which cannot be used in an URL or a
#   HTTP "POST" request). If the desired output should be one
#   line, use the "-l" option.
#
#    o  The "-l" option assumes, that the end-of-line is denoted by
#   the character LF (ASCII 10). This is not true for Windows or
#   Mac systems, where the end of a line is denoted by the two
#   characters CR LF (ASCII 13 10).
#   We use this for symmetry; data processed in the following way:
#       cat | urlencode -l | urldecode -l
#   should (and will) result in the original data
#
#    o  Large lines (or binary files) will break many AWK
#       implementations. If you get the message
#       awk: record `...' too long
#        record number xxx
#   consider using GNU AWK (gawk).
#
#    o  urlencode will always terminate it's output with an EOL
#       character
#
# Thanks to Stefan Brozinski for pointing out a bug related to non-standard
# locales.
#
# See also
#   urldecode
##########################################################################

PN=`basename "$0"`          # Program name
VER='1.4'

: ${AWK=awk}

Usage () {
    echo >&2 "$PN - encode URL data, $VER
usage: $PN [-l] [file ...]
    -l:  encode line endings (result will be one line of output)

The default is to encode each input line on its own."
    exit 1
}

Msg () {
    for MsgLine
    do echo "$PN: $MsgLine" >&2
    done
}

Fatal () { Msg "$@"; exit 1; }

set -- `getopt hl "$@" 2>/dev/null` || Usage
[ $# -lt 1 ] && Usage           # "getopt" detected an error

EncodeEOL=no
while [ $# -gt 0 ]
do
    case "$1" in
        -l) EncodeEOL=yes;;
    --) shift; break;;
    -h) Usage;;
    -*) Usage;;
    *)  break;;         # First file name
    esac
    shift
done

LANG=C  export LANG
$AWK '
    BEGIN {
    # We assume an awk implementation that is just plain dumb.
    # We will convert an character to its ASCII value with the
    # table ord[], and produce two-digit hexadecimal output
    # without the printf("%02X") feature.

    EOL = "%0A"     # "end of line" string (encoded)
    split ("1 2 3 4 5 6 7 8 9 A B C D E F", hextab, " ")
    hextab [0] = 0
    for ( i=1; i<=255; ++i ) ord [ sprintf ("%c", i) "" ] = i + 0
    if ("'"$EncodeEOL"'" == "yes") EncodeEOL = 1; else EncodeEOL = 0
    }
    {
    encoded = ""
    for ( i=1; i<=length ($0); ++i ) {
        c = substr ($0, i, 1)
        if ( c ~ /[a-zA-Z0-9.-]/ ) {
        encoded = encoded c     # safe character
        } else if ( c == " " ) {
        encoded = encoded "+"   # special handling
        } else {
        # unsafe character, encode it as a two-digit hex-number
        lo = ord [c] % 16
        hi = int (ord [c] / 16);
        encoded = encoded "%" hextab [hi] hextab [lo]
        }
    }
    if ( EncodeEOL ) {
        printf ("%s", encoded EOL)
    } else {
        print encoded
    }
    }
    END {
        #if ( EncodeEOL ) print ""
    }
' "$@"
14
ответ дан Pokechu22 23 November 2019 в 01:29
поделиться

Я нашел следующий фрагмент, который полезен для вставьте его в цепочку вызовов программ, где URI :: Escape может не быть установлен:

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

( source )

30
ответ дан 23 November 2019 в 01:29
поделиться

нахожу более читабельным в python:

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

тройка ' гарантирует, что одинарные кавычки в значении не повредят. urllib находится в стандартной библиотеке. Он работает на экзамене для этого сумасшедшего (реального мира) url:

"http://www.rai.it/dl/audio/" "1264165523944Ho servito il re d'Inghilterra - Puntata 7
47
ответ дан 23 November 2019 в 01:29
поделиться

Для тех из вас, кто ищет решение, которое не требует 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
   '`
}

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

7
ответ дан 23 November 2019 в 01:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: