Как urlencode данные для команды curl?
Я пытаюсь написать сценарий bash для тестирования, который принимает параметр и отправляет его через curl на веб-сайт. Мне нужно кодировать значение url, чтобы убедиться, что специальные символы обрабатываются правильно. Каков наилучший способ сделать это?
вот мой основной скрипт до сих пор:
30 ответов:
использовать curl —data-urlencode ; С man curl :
это публикует данные, похожие на другие —data параметры за исключением того, что это выполняет URL-кодирование. Чтобы быть CGI-совместимым, часть должна начинаться с имени, за которым следует разделитель и спецификация содержание.
посмотреть на странице для получения дополнительной информации.
для этого требуется curl 7.18.0 или новее (выпущен в январе 2008). Используйте curl -V чтобы проверить, какая версия у вас.
вы можете использовать его двумя способами:
вот соответствующая функция rawurldecode (), которая — со всей скромностью-потрясающая.
С помощью соответствующего набора теперь мы можем выполнить несколько простых тестов:
и если вы действительно чувствуете, что вам нужен внешний инструмент (ну, он будет идти намного быстрее, и может делать двоичных файлов и тому подобное. ) Я нашел это на моем Маршрутизатор OpenWRT.
где url_escape.sed был файл, который содержал следующие правила:
используйте Perl URI::Escape модуль uri_escape функция во второй строке вашего скрипта bash:
Edit: исправить проблемы с цитированием, как предложил Крис Джонсен в комментариях. Спасибо!
для полноты картины многие решения используют sed или awk только перевести специальный набор символов и, следовательно, довольно большой размер кода, а также не переводить другие специальные символы, которые должны быть закодированы.
безопасным способом urlencode было бы просто кодировать каждый байт — даже те, которые были бы разрешены.
xxd заботится здесь, что вход обрабатывается как байты, а не письмена.
xxd поставляется с пакетом vim-common в Debian, и я был просто в системе, где он не был установлен, и я не хотел его устанавливать. В altornative заключается в использовании hexdump из пакета bsdmainutils в Debian. Согласно следующему графику, bsdmainutils и vim-common должны иметь примерно равную вероятность быть установлено:
но все же вот версия, которая использует hexdump вместо xxd и позволяет избежать tr звоните:
Я нахожу его более читаемым в python:
тройка ‘ гарантирует, что одиночные кавычки в значении не повредит. urllib находится в стандартной библиотеке. Он работает для example для этого сумасшедшего (реального мира) url:
один из вариантов, может быть коряво, но просто:
вот однострочная версия, например (как предложено Бруно):
Я нашел следующий фрагмент кода полезным вставить его в цепочку вызовов программы, где URI:: Escape не может быть установлен:
Если вы хотите использовать GET запрос и использовать чистый локон просто добавить —get к решению @Jacob.
-s ( —slurp ) считывает входные строки в массив и -s -R ( —slurp —raw-input ) считывает входные данные в одну строку. -r ( —raw-output ) выводит содержимое строк вместо строковых литералов JSON.
или этот процент-кодирует все байты:
Источник