Использование curl в сценарии bash - для публикации токена авторизации - странное поведение? [дубликат]

Я новичок в программировании и написании сценариев, поэтому прошу прощения, если это очевидно. Я пытался получить помощь в другом месте, но не могу понять. Я создаю сценарий bash, который заставляет cron выполнять каждые X минут для обработки изменений состояния выполнения для пакета программного обеспечения безопасности NVR под названием «ZoneMinder». В настоящее время у меня есть задание cron по использованию двоичного файла под названием sunwait через небольшой скрипт, который я написал. Sunwait будет ждать, пока не наступит закат или восход солнца, а затем выполнит команду, поэтому, когда наступит закат, у меня есть Sunwait, чтобы переключить Zoneminder с «ДЕНЬ» на «НОЧЬ» и наоборот. Задание Cron выполняется в 1:00 и 13:00, поэтому есть окно 3-5+ часов, когда система может быть перезагружена для резервного копирования или чего-то еще, а затем состояние запуска не изменится. Это нехорошо, потому что у меня разные «зоны» и чувствительность к ДНЮ / НОЧИ.Этот сценарий позаботится обо всем этом, поскольку он будет запускаться каждые 5 или 10 минут и проверять все.

Чтобы войти в Zoneminder API и проверить текущее состояние запуска. Он инструктирует меня использовать curl для установки соединения с отслеживанием состояния и получения токена аутентификации.

      curl -XPOST -c cookies.txt -d "user=yourusername&pass=yourpassword&stateful=1" https://yourserver/zm/api/host/login.json

Я переключил эту командную строку на переменную сценария bash, но она не работает; он создает cookies.txt, но не выводит токены. Вместо этого он выдает ошибку 401 Unauthorized. Если я возьму команду curl, которую я выводю из сценария, и выполню ее в терминале, она вернет данные JSON с токенами, а также создаст файл cookie.txt точно так, как мне нужно.

Вот фрагмент кода, который является частью завитка.

      USER=<REDACTED>
PASSWD=<REDACTED>
CURL='/usr/bin/curl'
TOKE=/tmp/cookies.txt
CURL_ARGS="-XPOST -c $TOKE -d \"user=$USER_NAME&pass=$PASSWD&stateful=1\" -sS"
CURL_URL="https://<REDACTED>/zm/api/host/login.json"
get_token_file="$($CURL $CURL_ARGS $CURL_URL)"
cat $TOKE
echo "DEBUG - get_token_file  = $get_token_file"
echo "curl command= $CURL $CURL_ARGS $CURL_URL"

И вот результат этого фрагмента.

      cat $TOKE --------->    
    # Netscape HTTP Cookie File
    # https://curl.haxx.se/docs/http-cookies.html
    # This file was generated by libcurl! Edit at your own risk.
    
    #HttpOnly_<REDACTED>    FALSE   /   FALSE   1613342747  ZMSESSID    <REDACTED>

echo "DEBUG - get_token_file = $get_token_file" ------->
    DEBUG - get_token_file  = {"success":false,"data":{"name":"Not Authenticated","message":"Not Authenticated","url":"\/zm\/api\/host\/login.json","exception":{"class":"UnauthorizedException","code":401,"message":"Not Authenticated"}}}

echo "curl command= $CURL $CURL_ARGS $CURL_URL" ------>
    curl command= /usr/bin/curl -XPOST -c /tmp/cookies.txt -d "user=<REDACTED>&pass=<REDACTED>&stateful=1" -sS https://<REDACTED>/zm/api/host/login.json

Если я скопирую и вставлю команду curl /usr/bin/curl -XPOST -c /tmp/cookies.txt -d "user=<REDACTED>&pass=<REDACTED>&stateful=1" -sS https://<REDACTED>/zm/api/host/login.json он работает как положено.

Вот результат копирования и вставки команды echod outcurl. Почему этого не выводится в переменную $get_token_file ?!

      {"access_token":"<REDACTED>","access_token_expires":7200,"refresh_token":"<REDACTED>","refresh_token_expires":86400,"credentials":"auth=<REDACTED>","append_password":0,"version":"1.35.16","apiversion":"2.0"}

Что мне здесь не хватает?

Спасибо за любой совет или понимание!

0 ответов

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