Почему cron молча запускает файлы sudo в моем скрипте?

У меня есть сценарий, выполняемый crontab непривилегированных пользователей, который вызывает некоторые команды, используя sudo. Кроме этого нет. Скрипт работает нормально, но команды sudo'ed молча выходят из строя.

  • Скрипт отлично работает с оболочкой в ​​качестве пользователя.

  • Судо не требует пароля. У данного пользователя есть (root) NOPASSWD: ALL доступ, предоставленный в /etc/sudoers.

  • Cron запускается и выполняет скрипт. Добавление простого date > /tmp/log выводит результат в нужное время.

  • Это не проблема с разрешениями. Снова скрипт запускается, а не команды sudo'ed.

  • Это не проблема пути. Запуск env из запускаемого скрипта показывает правильный $PATH, которая включает в себя путь к sudo. Выполнение его с использованием полного пути не помогает. Выполняется команда с полным именем пути.

  • Попытка захвата вывода команды sudo, включая STDERR, не показывает ничего полезного. Добавление sudo echo test 2>&1 > /tmp/log к сценарию создает пустой журнал.

  • Сам файл sudo выполняет отлично и распознает, что он имеет разрешения даже при запуске cron внутри скрипта. Добавление sudo -l > /tmp/log к сценарию создает вывод:

      

    Пользователь ec2-user может выполнять следующие команды на этом хосте:
      (root) NOPASSWD: ALL

Изучение кода выхода команды с помощью $? показывает, что она возвращает ошибку (код выхода: 1), но ошибка не возникает. Команда, простая как /usr/bin/sudo /bin/echo test, возвращает тот же код ошибки.

Что еще может происходить?

Это недавно созданная виртуальная машина с новейшим AMI Amazon Linux. Crontab принадлежит пользователю ec2-user, а файл sudoers - это дистрибутив по умолчанию.

28 голосов | спросил Caleb 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 25 Sep 2012 13:44:12 +0400 2012, 13:44:12

1 ответ


39

У Sudo есть специальные опции в файле разрешений, один из которых позволяет ограничить его использование оболочками, которые запущены внутри TTY, а cron - нет.

Некоторые дистрибутивы, включая AMI Amazon Linux AMI, по умолчанию включены. Файл /etc/sudoers будет выглядеть примерно так:

# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
#         You have to run "ssh -t hostname sudo <cmd>".
#
Defaults    requiretty

#
# Refuse to run if unable to disable echo on the tty. This setting should also be
# changed in order to be able to use sudo without a tty. See requiretty above.
#
Defaults   !visiblepw

Если вы захватили вывод в STDERR на уровне скрипта оболочки, а не самой команды sudo, у вас появилось бы что-то вроде этого:

  

Извините, у вас должно быть tty для запуска sudo

Решение состоит в том, чтобы позволить sudo выполнять в средах без TTY либо путем удаления, либо комментирования этих параметров:

#Defaults    requiretty
#Defaults   !visiblepw
ответил Caleb 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 25 Sep 2012 13:44:12 +0400 2012, 13:44:12

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132