Использование Bash в Windows: “Не может отправить пустое сообщение” ошибка

Таким образом, мне нужен способ отправить некоторый 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 не любит?

Я смешал с пробелами и другим материалом, но только повредился больше.

3
задан 21 January 2019 в 12:27

1 ответ

Проблему в Вашем сценарии на самом деле показывает очень ясно Спросить подсветка синтаксиса 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 как работа выхода оболочки, не плохо себя чувствуйте об этом - общее выполнение его ;-)

То, что Вы хотите сделать, если Вы хотите поместить двойные кавычки в дважды заключенной в кавычки строке, должно "выйти" из них - заставляют оболочку не рассматривать их как специальные символы, но как просто часть текста строки. Существует два главных способа сделать это:

  1. используйте в своих интересах то, что строки в оболочке на самом деле не требуют заключения в кавычки и могли просто быть словами, сгруппированными вместе без пробелов, или несколько заключили в кавычки строку, сгруппированную вместе без пробелов. Таким образом, это могло быть похожим на это: "curl -H "'"'"Content-Type:application/json"'"'" ...". Вы видите, что вместо того, чтобы просто поместить двойную кавычку, мы понимаем, что двойная кавычка на самом деле завершает строку, запущенную вначале, и не является на самом деле частью входа, и прежде чем оболочка будет видеть конец входа (из-за пространства), мы сразу запускаем новую строку, разграниченный одинарными кавычками - которые содержат только символ двойной кавычки, и так далее - это на самом деле подобно последнему echo команда в первом примере.
  2. используйте обратную косую черту, чтобы заставить внутренние символы двойной кавычки не быть рассмотренными, строковые разделители - выходят из них из парсинга: "curl -H \"Content-Type:application/json\" -X...

Я лично предпочитаю первый метод.

4
ответ дан 1 December 2019 в 15:49

Другие вопросы по тегам:

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