Вопрос или проблема
Я столкнулся с проблемой в 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 и способы их устранения.
Анализ ошибок
-
Ошибка 403 (Server failed to authenticate the request):
- Эта ошибка указывает на проблему с авторизацией, что говорит о том, что сервер не принимает заголовок авторизации, который формируется в AzCopy. Причиной может быть то, что при выполнении команды в пакетном файле, AzCopy не может получить правильный SAS-токен или другие необходимые настройки.
-
Ошибка 401 (NoAuthenticationInformation):
- Эта ошибка указывает на отсутствие информации для аутентификации. Если вы открываете новое окно CMD через
start cmd /k
, тогда может происходить утечка контекста переменных окружения.
- Эта ошибка указывает на отсутствие информации для аутентификации. Если вы открываете новое окно CMD через
Причины и решения
-
Переменные окружения:
- Убедитесь, что все переменные окружения, которые могли быть настроены в вашей сессии CMD, доступны в вашей пакетной программе. Если вы используете какие-либо переменные среды (например, для хранения токена), убедитесь, что их значения правильно передаются в пакетный файл.
-
Полный путь к AzCopy:
- Убедитесь, что команда AzCopy доступна в середине вашего скрипта. Вы уже правильно используете
cd
, но возможно, стоит использовать полный путь кazcopy.exe
во всех вызовах команды в пакетном файле.
- Убедитесь, что команда AzCopy доступна в середине вашего скрипта. Вы уже правильно используете
-
Проблемы с кодировкой:
- Убедитесь, что кодировка вашего пакетного файла соответствует стандартной (обычно ANSI или UTF-8). Неправильная кодировка может привести к некорректной интерпретации символов в AJAX-запросах.
-
Запуск от имени администратора:
- Убедитесь, что задачи, которые выполняются через планировщик задач, запускаются с необходимыми правами. Попробуйте запустить пакетный файл от имени администратора или проверьте настройки безопасности, которые могут ограничивать доступ приложений к 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
Проверка работоспособности
- Тестирование в CMD: Перед запуском через планировщик задач протестируйте пакетный файл, запустив его вручную из CMD.
- Логи: Добавьте вывод в файл для отладки или используйте команды
echo
для отслеживания выполнения. - Проверка прав: Убедитесь, что у службы, под которой запускается задача, есть необходимые права доступа к файловой системе и сети.
Таким образом, следуя данным рекомендациям и исправлениям, вам удастся решить проблему с ошибками авторизации при запуске скрипта через пакетный файл.