Чому Cron мовчки не вдається запустити матеріали судо в моєму сценарії?


30

У мене сценарій запущений із кроніту непривілейованих користувачів, який викликає деякі команди, використовуючи sudo. За винятком цього немає. Сценарій працює добре, але команди sudo'ed мовчки не вдається.

  • Сценарій ідеально працює з оболонки, як йдеться про користувача.

  • Судо не вимагає пароля. Користувач, про якого йдеться, має (root) NOPASSWD: ALLдоступ у /etc/sudoers.

  • Cron працює і виконує сценарій. Додавання простого date > /tmp/logдає результат у потрібний час.

  • Це не проблема дозволів. Знову сценарій дійсно виконується, тільки не судо-команд.

  • Це не проблема шляху. Запуск 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повертає той самий код помилки.

Що ще може бути?

Це нещодавно створена віртуальна машина, на якій працює останній AMI Amazon Linux AMI. Crontab належить користувачеві, ec2-userа файл sudoers - типовим для розподілу.


1
Я збирався говорити про рішення, але потім я прочитав, The user in question has (root) NOPASSWD: ALL access granted in /etc/sudoersі мій мозок почав кричати занадто голосно, щоб продовжувати читати.
Шадур

@Shadur: Поговоріть на руку. Це не мій спосіб налаштування машини, але ці машини виходять таким чином. Навіть через вашу машину ви не отримаєте корінний пароль, ваш ключ як власника вікна переходить до облікового запису користувача ec2, який має (як зазначалося) повний доступ до sudo. Ви також не отримаєте пароль для користувача ec2, якщо ви не встановили його, це лише вхід у систему.
Калеб

1
Тоді перше, що я рекомендую вам зробити, - це створити окремого користувача з обмеженими sudoправами / лише / для команд, необхідних у сценарії, та повністю відключити їх можливість входу.
Шадур

якщо у вас є root, і ви хочете, щоб завдання cron запускалися як root, то навіщо його ставити в crontab користувача ec2? не став би кореневий кронтаб більш підходящим? або / тощо / crontab?
cas

@CraigSanders: Я не хочу, щоб робота cron виконувалася як root, адже більшість її потрібно виконувати як користувач. Питання не в тому, щоб виконати завдання як root, а про те, щоб сценарій спеціально отримав доступ до однієї функції через sudo.
Калеб

Відповіді:


40

У файлі дозволів Судо є деякі спеціальні параметри, один з яких дозволяє обмежити його використання для оболонок, які запущені всередині TTY, а це не є кроном.

Деякі дистрибутиви, включаючи AMI Amazon Linux, увімкнули це за замовчуванням. /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, вам, здавалося б, вийшло щось подібне:

Вибачте, ти повинен мати тти для запуску судо

Рішення полягає в тому, щоб дозволити виконувати sudo в не TTY середовищі, видаляючи або коментуючи ці параметри:

#Defaults    requiretty
#Defaults   !visiblepw

1
Я можу підтвердити, що у CentOS є такі обмеження.
aeu

Схоже, що в CentOS 7 додано musttty, тому, хоча це не потрібно для CentOS 6, це стосується CentOS 7+. На мій досвід, команди sudo з cron працюють на CentOS 6, навіть якщо Defaults !visiblepwввімкнено / не коментовано.
кевінміке
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.