AzCopy загружает файлы в CMD, но выдает ошибки 403/401 в пакетном скрипте

Вопрос или проблема

Я столкнулся с проблемой в AzCopy, когда мой скрипт работает безупречно в CMD, но выдает ошибки аутентификации, когда выполняется через батник. Вот краткая информация о ситуации:

Цель состоит в том, чтобы ежедневно сохранять наши файлы в учётной записи хранилища с помощью планировщика задач; скорее всего, это будет только один файл за день/запуск.

Мой батник:

@echo off
cd "C:\Program Files\AzCopy"
azcopy cp "G:\Backup\UATBackups\*" "https://<имя-учетной-записи>.blob.core.windows.net/test/?sp=rw&st=2024-10-08T15:28:58Z&se=2024-10-08T23:28:58Z&spr=https&sv=2022-11-02&sr=c&sig=<SAS-токен>" --recursive=true --block-blob-tier=Cold --overwrite=false

Когда я запускаю эту команду вручную в CMD: (после перехода в директорию AzCopy)

azcopy cp "G:\Backup\UATBackups\*" "https://<имя-учетной-записи>.blob.core.windows.net/test/?sp=rw&st=2024-10-08T15:28:58Z&se=2024-10-08T23:28:58Z&spr=https&sv=2022-11-02&sr=c&sig=<SAS-токен>" --recursive=true --block-blob-tier=Cold --overwrite=false

Это работает идеально, и все файлы загружаются, как ожидалось.

Однако, когда я запускаю батник, я получаю:

RESPONSE Status: 403 Сервер не смог аутентифицировать запрос. Убедитесь, что значение заголовка Authorization сформировано правильно, включая подпись.

Я также пытался изменить батник, чтобы он открывал CMD и выполнял команду так, как если бы я делал это вручную:

start cmd /k ""C:\Program Files\AzCopy\azcopy.exe" cp "G:\Backup\UATBackups\*" "https://<имя-учетной-записи>.blob.core.windows.net/test/?sp=rw&st=2024-10-08T15:28:58Z&se=2024-10-08T23:28:58Z&spr=https&sv=2022-11-02&sr=c&sig=<SAS-токен>" --recursive=true --block-blob-tier=Cold --overwrite=false"

Но это дает мне:

RESPONSE 401: 401 Сервер не смог аутентифицировать запрос. Пожалуйста, обратитесь к информации в заголовке www-authenticate.
КОД ОШИБКИ: NoAuthenticationInformation

Что я проверил:

  • SAS-токен действителен и не истек.
  • Время на виртуальной машине синхронизировано правильно.
  • Я использую одну и ту же учетную запись для запуска как CMD, так и батника.

Мой вопрос:

  • Почему команда работает идеально, когда я запускаю её вручную в CMD, но выдает ошибку 403, когда выполняется через батник (даже используя одну и ту же учетную запись)?
  • Что нужно изменить и как это исправить!

Любая помощь или предложения были бы очень признательны. Спасибо!

Ответ или решение

Проблема, с которой вы столкнулись, связана с различиями в контексте выполнения команд в окне командной строки (CMD) и в пакетном файле (batch file). Давайте рассмотрим возможные причины возникновения ошибок 403 и 401 и способы их устранения.

Анализ ошибок

  1. Ошибка 403 (Server failed to authenticate the request):

    • Эта ошибка указывает на проблему с авторизацией, что говорит о том, что сервер не принимает заголовок авторизации, который формируется в AzCopy. Причиной может быть то, что при выполнении команды в пакетном файле, AzCopy не может получить правильный SAS-токен или другие необходимые настройки.
  2. Ошибка 401 (NoAuthenticationInformation):

    • Эта ошибка указывает на отсутствие информации для аутентификации. Если вы открываете новое окно CMD через start cmd /k, тогда может происходить утечка контекста переменных окружения.

Причины и решения

  1. Переменные окружения:

    • Убедитесь, что все переменные окружения, которые могли быть настроены в вашей сессии CMD, доступны в вашей пакетной программе. Если вы используете какие-либо переменные среды (например, для хранения токена), убедитесь, что их значения правильно передаются в пакетный файл.
  2. Полный путь к AzCopy:

    • Убедитесь, что команда AzCopy доступна в середине вашего скрипта. Вы уже правильно используете cd, но возможно, стоит использовать полный путь к azcopy.exe во всех вызовах команды в пакетном файле.
  3. Проблемы с кодировкой:

    • Убедитесь, что кодировка вашего пакетного файла соответствует стандартной (обычно ANSI или UTF-8). Неправильная кодировка может привести к некорректной интерпретации символов в AJAX-запросах.
  4. Запуск от имени администратора:

    • Убедитесь, что задачи, которые выполняются через планировщик задач, запускаются с необходимыми правами. Попробуйте запустить пакетный файл от имени администратора или проверьте настройки безопасности, которые могут ограничивать доступ приложений к Azure.

Обновленный файл

Попробуйте следующий подход к вашему пакетному файлу:

@echo off
setlocal

REM Путь к AzCopy
set AzCopyPath="C:\Program Files\AzCopy\azcopy.exe"

REM Путь к файлам и URL
set SourcePath="G:\Backup\UATBackups\*"
set DestinationUrl="https://<storage-account-name>.blob.core.windows.net/test/?sp=rw&st=2024-10-08T15:28:58Z&se=2024-10-08T23:28:58Z&spr=https&sv=2022-11-02&sr=c&sig=<SAS-token>"

REM Выполнить AzCopy
%AzCopyPath% cp %SourcePath% %DestinationUrl% --recursive=true --block-blob-tier=Cold --overwrite=false

endlocal

Проверка работоспособности

  1. Тестирование в CMD: Перед запуском через планировщик задач протестируйте пакетный файл, запустив его вручную из CMD.
  2. Логи: Добавьте вывод в файл для отладки или используйте команды echo для отслеживания выполнения.
  3. Проверка прав: Убедитесь, что у службы, под которой запускается задача, есть необходимые права доступа к файловой системе и сети.

Таким образом, следуя данным рекомендациям и исправлениям, вам удастся решить проблему с ошибками авторизации при запуске скрипта через пакетный файл.

Оцените материал
Добавить комментарий

Капча загружается...