Выполнение команды curl через bash вернуло сообщение «URL отклонен: неверное имя хоста», но работает в командной строке

Когда я пытаюсь запустить этот cmd через bash вот так

Баш-скрипт

mycommand = "curl $mycommand --url '${requestURL}'"
echo "Search Command $mycommand"
myresponse = "$(${mycommand})"

Выход

Search Command curl -v -X GET --header Authorization:'Bearer ---very long access token---' -s '
https://my-rest-services:443/mypath/someparameters'
* URL rejected: Bad hostname
* Closing connection
* URL rejected: Port number was not a decimal number between 0 and 65535
* Closing connection

Когда я запускаю команду Follow в строке cmd, она работает отлично и возвращает мой ответ в формате JSON.

curl -v -X GET --header Authorization:'Bearer ---very long access token---' -s '
https://my-rest-services:443/mypath/someparameters'

{myjson response}

Не храните команды в переменных. Переменные предназначены для данных, а не для исполняемого кода. Если вам нужно хранить исполняемый код, используйте функцию, а для простых команд — массив. См. BashFAQ №50: «Я пытаюсь поместить команду в переменную, но в сложных случаях всегда терпит неудачу!» , «Почему оболочка игнорирует символы кавычек в аргументах, передаваемых ей через переменные?», и многие другие предыдущие вопросы. Но игнорируйте все предложения по использованию eval, это огромный магнит для ошибок.

Gordon Davisson 25.04.2024 11:35

@GordonDavisson, это очень хороший совет.. читай до конца

Siddharth 25.04.2024 12:10

@GordonDavisson, можете ли вы дать мне фрагмент кода, который заставит его работать без eval, а также вернет json, который возвращает Curl, пожалуйста?

Siddharth 25.04.2024 15:59

Есть ли причина сначала сохранить команду. а не просто использовать echo "Search Command curl $mSearchCommand --url '${requestURL}'"; mSearchResponse = "$(curl $mSearchCommand --url "$requestURL}")"?

Gordon Davisson 25.04.2024 17:09

Я получаю ответ на поиск {"code":"401", "message":"Индекс строки вне диапазона: -1"}

Siddharth 25.04.2024 20:18

О, я не заметил, что $mSearchCommand также содержит синтаксис оболочки (что вызывает те же проблемы). Как установлена ​​эта переменная и почему она находится в переменной, а не является просто отдельным параметром фактической команды?

Gordon Davisson 25.04.2024 23:13

Я проведу рефакторинг кода согласно совету и вернусь.

Siddharth 26.04.2024 05:24

mSearchResponse = "$(curl -v --header Authorization:\'Bearer $accessTokenFromAuthResponse\' --url 'myfullurl')" возвращает >>>> Accept: / > Authorization:'Bearer > < HTTP/2 401 <<<

Siddharth 26.04.2024 11:00

echo on $accessTokenFromAuthResponse возвращает полный токен.. что мне не хватает?..? $accessTokenFromAuthResponse — это данные.

Siddharth 26.04.2024 11:00

Давайте продолжим обсуждение в чате.

Gordon Davisson 26.04.2024 11:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
10
4 062
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я изменил свой bash-скрипт, как показано ниже, и он начал работать. «eval» был способом его запуска.

    mycommand = "curl $mycommand --url '${requestURL}'"
    echo "Search Command $mycommand"
    eval "$mycommand"

Изменить, согласно замечательному совету @Gordon, я добавляю лучший ответ.

  • Использование eval не рекомендуется.
  • Не используйте строки для команд, только для данных

Это то, что я сделал, чтобы все заработало.

function callingMyAPI {
    requestURL = "$1"
    accessTokenFromAuthResponse = "$2"
    #My REQUEST
    callingMyAPI=$(curl --header "Authorization: Bearer $accessTokenFromAuthResponse" $requestURL)
}

callingMyAPI "$url" $accessToken 

Это сработало.

Пожалуйста, не используйте eval для подобных вещей, он имеет тенденцию решать простые проблемы, но позже вызывает неожиданные странные проблемы, в частности, когда в ваших данных появляются неожиданные символы синтаксиса оболочки - и eval анализирует (и, возможно, выполняет) их как оболочку. синтаксис. См. «Почему следует избегать eval в Bash и что мне следует использовать вместо этого?»

Gordon Davisson 25.04.2024 11:41

Вы можете просто оставить eval и раскавычить последнюю строку.

mycommand = "curl $mycommand --url '${requestURL}'"
echo "Search Command $mycommand"
$myresponse

Не работало. Curl: (3) URL-адрес отклонен: неправильное имя хоста. Curl: (3) URL-адрес отклонен: номер порта не является десятичным числом от 0 до 65535. Curl: (3) URL-адрес отклонен: номер порта не является десятичным числом от 0 до 65535. 65535

Siddharth 25.04.2024 15:55

Тот факт, что вы получили сообщение об ошибке от Curl, на самом деле показывает, что он работает, но у вас есть ошибка с вашим ${requestURL}.

martijn 27.04.2024 13:02

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