У меня есть скрипт, запускаемый из 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 является дистрибутивом по умолчанию.
The user in question has (root) NOPASSWD: ALL access granted in /etc/sudoers
и мой мозг начал кричать слишком громко, чтобы продолжать читать.sudo
правами / только / для команд, которые вам нужны в сценарии, и полностью отключить его возможность входа в систему.Ответы:
В файле разрешений Sudo есть несколько специальных опций, одна из которых позволяет ограничить его использование для оболочек, которые работают внутри TTY, а cron - нет.
В некоторых дистрибутивах, включая Amazon Linux AMI, эта опция включена по умолчанию.
/etc/sudoers
Файл будет выглядеть следующим образом :Если бы вы захватили вывод в STDERR на уровне сценария оболочки, а не самой команды sudo, вы бы выглядели примерно так:
Решение состоит в том, чтобы разрешить выполнение sudo в средах без TTY, удалив или закомментировав эти параметры:
источник
Defaults !visiblepw
включены / не закомментированы.