Использование 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"}
Что мне здесь не хватает?
Спасибо за любой совет или понимание!