У меня есть скрипт, запускаемый из crontab непривилегированных пользователей, который вызывает некоторые команды, используя sudo. За исключением того, что это не так. Скрипт работает нормально, но команды sudo'а молча терпят неудачу.
Скрипт отлично запускается из оболочки как пользователь, о котором идет речь.
Sudo не требует пароля. У данного пользователя есть
(root) NOPASSWD: ALLдоступ, предоставленный в/etc/sudoers.Cron запускает и выполняет скрипт. Добавление простого
date > /tmp/logпроизводит вывод в нужное время.Это не проблема с разрешениями. Снова выполняется скрипт, но не команды sudo.
Это не проблема пути. Запуск
envизнутри запускаемого скрипта показывает правильную$PATHпеременную, которая включает путь к sudo. Запуск по полному пути не помогает. Выполняемой команде дается полный путь.Попытка перехватить вывод команды sudo, включая STDERR, не дает ничего полезного. Добавление
sudo echo test 2>&1 > /tmp/logв скрипт приводит к пустому логу.Сам двоичный файл sudo выполняется нормально и распознает, что у него есть разрешения, даже если он запускается из cron внутри скрипта. Добавление
sudo -l > /tmp/logк сценарию приводит к выводу:Пользователь ec2-пользователь может запускать следующие команды на этом хосте:
(root) NOPASSWD: ALL
Изучение кода завершения команды с использованием $?показывает, что она возвращает ошибку (код выхода:) 1, но, похоже, ошибки не возникает. Такая простая команда /usr/bin/sudo /bin/echo testвозвращает тот же код ошибки.
Что еще может происходить?
Это недавно созданная виртуальная машина с последней версией Amazon Linux AMI. Crontab принадлежит пользователю, ec2-userа файл sudoers является дистрибутивом по умолчанию.
sudoправами / только / для команд, которые вам нужны в сценарии, и полностью отключить его возможность входа в систему.
The user in question has (root) NOPASSWD: ALL access granted in /etc/sudoersи мой мозг начал кричать слишком громко, чтобы продолжать читать.