Как запустить задание cron с помощью команды sudo

118

Можно ли запустить задание cron, для которого нужна команда sudo ?

Подобно:

 sudo rm somefile
Сайем Сиам
источник
Добро пожаловать, Сайем Сиам, взгляните на ответы на этот вопрос askubuntu.com/questions/2368/how-do-i-setup-cron-job . как я думаю, ваш вопрос уже задавался здесь, на AU
stephenmyall
1
Я пытаюсь выполнить sudo, которому нужен пароль, но как я могу получить пароль из файла cron
sayem siam
3
@sayemsiam вам не нужно ставить sudo, просто отредактируйте корневой crontab.
Брайам
Смотрите этот ответ .
Сампаблокупер

Ответы:

240

Я не буду вдаваться в подробности, насколько это плохая идея; Проще говоря, запуск sudoв crontab требует, чтобы ваш пароль хранился где-нибудь в виде открытого текста.

Это плохая идея.


Ниже приведен предпочтительный метод запуска административных задач через cron. Поскольку вам не нужно писать sudoв crontab, если вы изменяете crontab root.

Использовать crontab root

Запустите следующую команду:

sudo crontab -e

Это открывает rootcrontab. sudoНет необходимости запускать вашу команду в этом контексте, так как она будет вызываться как и в rootлюбом случае.

Таким образом, вы просто добавили бы следующее в crontab root.

@hourly rm somefile

Теперь, если вы абсолютно хотите быть небезопасными и рисковать своим паролем, следующие команды запустят вашу команду из вашего собственного crontab и автоматически введут ваш пароль при появлении соответствующего запроса sudo.

Опять же, это не рекомендуется .


В вашем собственном crontab напишите вашу команду так:

@hourly echo "password" | sudo -S rm somefile

Очевидным недостатком здесь является то, что, если кто-нибудь когда-нибудь получит доступ к вашему crontab, ваш пароль будет доступен для чтения в виде открытого текста.

Ты не должен этого делать.

SirCharlo
источник
1
Рад, что это работает! Просто будьте осторожны с любыми дырами в безопасности, которые вы оставите позади. Они могут вернуться позже, чтобы преследовать вас.
SirCharlo
1
@SirCharlo Зачем использовать rootпользовательский crontab вместо общесистемного crontab /etc/crontab?
Элия ​​Каган
1
@ Элайджа, почему бы и нет?
СэрЧарло
2
Этот ответ пропускает оценку, потому что он скрывает тонкости, имеющиеся в вашем sudoersфайле, например, группы sudo без требования пароля.
Brent
очень очень полезный момент, спасибо за большую помощь.
Насер Мансури
33

Если вы помещаете скрипт из одной из директорий cron ( /etc/cron.*), вам не нужно использовать sudo, так как он запускается от имени root.

Если вы используете crontab, то вы захотите использовать crontab root. Это запустит его как root, а также не нужно sudo.

sudo crontab -e
tgm4883
источник
1
Я также поместил бы команду в /etc/cron.hourly/something. Вот для чего эти каталоги.
Джон С. Грубер
3
Нет. Вы можете поместить это в /etc/cron.SOMETHING/SCRIPT, но я бы не стал делать то и другое. Оба дали бы примерно одинаковую функцию, хотя с помощью crontab у вас было бы немного больше власти над тем, как часто / когда все работает.
tgm4883
1
Я должен был дать понять, что я имел в виду в качестве альтернативы. Благодарю.
Джон С. Грубер
3

Запустите следующую команду в терминале

sudo visudo

Добавил следующую строку в конец файла:

vidyadhar  ALL= NOPASSWD: /bin/rm

В приведенном выше примере vidyadhar является именем пользователя, и он не будет запрашивать пароль, если вы запускаете команду rm через vidyadhar.

Vidyadhar
источник
17
Хм ... Тогда любая вредоносная команда, такая как sudo rm -rf 'slash'( не запускать эту команду ), запускаемая этим пользователем, не требует пароля ... Я не знаю, это кажется небезопасным, нет?
SirCharlo
Я знаю это. Ваш подход хорош. Но я использую описанный выше подход для предоставления права другому пользователю останавливать / запускать определенные службы.
Видьядхар
24
Это очень плохая идея. Пожалуйста, не делай этого.
bkanuka
2
Может быть vidyadhar ALL= NOPASSWD: /bin/rm somefile, будет более безопасным.
Вернфрид Домшайт
Это ужасная идея. Вы дали полное разрешение sudo для rm. Вместо этого, предоставьте права sudo для сценария, который ваша команда, включая rm или других в этом сценарии, сделайте его исполняемым, затем предоставьте разрешения sudo для этого сценария. <username> ALL=(ALL) NOPASSWD: /home/<username>/bin/<script>, что было бы намного безопаснее.
RJ