Таким образом, мне нужен способ отправить некоторый webhooks в разногласия от машины Windows, делая, таким образом, в Linux не проблемы с curl
, таким образом, я установил Ubuntu 18, LTS на машину из Приложений Windows хранят и дали ей движение.
Вот то, где проблемы запускаются, когда я использую ту же команду в Windows:
bash -c "curl -H "Content-Type:application/json" -X POST -d '{"x": "x", "content": "hello"}' https://discordapp.com/api/webhooks/536660752111763477/zkW73A97-TNJVcH3xMCK0GMHEkwqKNWSfslA0WxxxxxxMYOLTRi6UMXYR_QLDCfxIJ_d"
Я получаю эту ошибку:
{"code": 50006, "message": "Cannot send an empty message"}
Что в той строке Windows не любит?
Я смешал с пробелами и другим материалом, но только повредился больше.
Проблему в Вашем сценарии на самом деле показывает очень ясно Спросить подсветка синтаксиса Ubuntu - как Вы видите в своем ответе, "x"
в Вашем сообщении окрашен в черный, потому что это за пределами дважды заключенной в кавычки строки, которая является значением для -c
параметр к bash
. Эта проблема повторяется всюду по Вашему коду.
Путем строковая работа в оболочке состоит в том, что двойные кавычки являются способом заставить несколько слов (т.е. последовательности символов, содержащие пробелы) появляться как отдельное слово для оболочки. Оболочка затем передает эти слова, как - без строковых двойных кавычек включения - к программе для выполнения. Можно также заставить текст быть сгруппированным в то же слово просто squizzing текст вместе без пробелов.
Таким образом, следующие команды являются всеми одинаковыми для оболочки и покажут тот же вывод:
echo 123
echo "1"23
echo "1"2"3"
echo "1"'2'"3"
Во всех случаях echo
просто видит текст"123
"(последний я вставил некоторые одинарные кавычки, который для большого количества эффектов ведет себя то же.
Поэтому, имея это в виду, давайте проанализируем Вашу строку сценария:
bash -c "curl -H "Content-Type:application/json" -X POST -d '{"x": "x", "content": "hello"}' https://discordapp.com/some/path"
Мы видим, что Вы передаете много кода к bash
как -c
параметр, который является "командой для выполнения". Так bash
будет выполнен с двумя аргументами - первый -c
и второй является всем текстом, который нужно считать "командой". Второй аргумент использует дважды заключенные в кавычки строки (да, множественное число) для кодирования некоторых пробелов и других символов оболочки, таким образом, они будут переданы, как к "команде для выполнения" параметра.
Давайте сделаем вручную, что оболочка делает для понимания второго параметра путем преобразования всех "слов" как классического массива строк языка программирования:
var a = [
"-c",
"curl -H " + "Content-Type:application/json" + " -X POST -d '{" + "x" +
": " + "x" + ", " + "content" + ": " + "hello" +
"}' https://discordapp.com/some/path"
]
Затем оболочка разрешит список строк и выполнит удар:
execve("bash", "-c", "curl -H Content-Type:application/json -X POST -d '{x: x, content: hello}' https://discordapp.com/some/path");
Поскольку Вы видите, что в полезной нагрузке POST JSON больше нет двойных кавычек: они были удалены оболочкой, пытающейся понять, какие строки составляют второй аргумент. Это заставляет полезную нагрузку становиться недопустимой и сервер, чтобы думать, что Вы не обеспечили вход.
BTW: на основе моего опыта - то, что Вы только что продемонстрировали, является неверным толкованием номер 1 как работа выхода оболочки, не плохо себя чувствуйте об этом - общее выполнение его ;-)
То, что Вы хотите сделать, если Вы хотите поместить двойные кавычки в дважды заключенной в кавычки строке, должно "выйти" из них - заставляют оболочку не рассматривать их как специальные символы, но как просто часть текста строки. Существует два главных способа сделать это:
"curl -H "'"'"Content-Type:application/json"'"'" ..."
. Вы видите, что вместо того, чтобы просто поместить двойную кавычку, мы понимаем, что двойная кавычка на самом деле завершает строку, запущенную вначале, и не является на самом деле частью входа, и прежде чем оболочка будет видеть конец входа (из-за пространства), мы сразу запускаем новую строку, разграниченный одинарными кавычками - которые содержат только символ двойной кавычки, и так далее - это на самом деле подобно последнему echo
команда в первом примере."curl -H \"Content-Type:application/json\" -X...
Я лично предпочитаю первый метод.