Как использовать crontab для запуска скрипта, как никто

23789
fixer1234

Это на машине CentOS. Я пытаюсь запускать скрипт как пользователь ник (или как пользователь с минимальными разрешениями) в определенное время каждый день. Здесь никого нет

[root@CentOS % ~] grep "^nobody" /etc/passwd  nobody:x:99:99:Nobody:/:/sbin/nologin  

вот что я попробовал в crontab root:

установка переменной среды SUDO_USER = nobody
15 17 * * * sudo -u nobody / bin / bash /usr/local/bin/bashscript.sh
15 17 * * * su -c /usr/local/bin/bashscript.sh nobody

Я хотел бы сохранить запись crontab в crontab root, если это вообще возможно. Я также предпочел бы не дурачиться с пользовательской учетной записью, так как я не хочу нарушать что-либо еще, что может зависеть от этих настроек. Я не против создания другой непривилегированной учетной записи и предоставления им реальной оболочки, если это является камнем преткновения.

Я также признаюсь, что был немного озадачен. Я бы предположил, что это будет повседневной проблемой, за исключением того, что мой коричневый пояс в Google-фу не очень помогает.

3
Как вы определяете, работает ли скрипт под никем или каким-либо другим пользователем? Оба способа работают на меня. whitequark 14 лет назад 0
@whitequark - скрипт создает выходной файл, если он выполняется. Он создает его в / tmp (где я предполагаю, что у пользователя "nobody" нет привилегий. 14 лет назад 0
Кроме того, в системе нет ни /etc/cron.d/crontab.allow, ни /etc/cron.d/crontab.deny. 14 лет назад 0
Вы пытались запустить его с `su nobody` вручную? Вы проверяли журналы cron (возможно, вывод syslog) после того, как он должен был быть запущен? whitequark 14 лет назад 0
@whitequark - у cron есть логи? позвольте мне посмотреть 21 января 18:25:01 `uname -n` crond [7776]: (root) CMD (su -c /usr/local/bin/bashscript.sh nobody), так что root находится в этих скобках, так что вот кто запустил скрипт. но выполнение этого в командной строке вызывает у меня «Эта учетная запись в настоящее время недоступна». b / c / etc / passwd установлен на nologin 14 лет назад 0
@whitequark sudo -u никто /usr/local/bin/bashscript.sh работает из командной строки, позвольте мне снова запустить его из crontab и посмотреть журналы ... 14 лет назад 0
@whitequark (первая строка crontab, вторая строка журнала [отредактировано]) 18 19 * * * sudo -u nobody /usr/local/bin/script.sh 21 января 19:18:01 fakename crond [14653]: (root) CMD (sudo -u nobody /usr/local/bin/script.sh) выше не создает выходной файл, но работает из командной строки ОК 14 лет назад 0
25 19 * * * sudo -u pica / bin / bash /usr/local/bin/bashscript.sh (работает как моя учетная запись, активная учетная запись, которая может использовать sudo, не работала в crontab, но снова работала из команды root линия) 14 лет назад 0

5 ответов на вопрос

6
Simon Lindgren

Я предполагаю, что вы публикуете содержимое crontab -eилиcrontab -l ?

Это файл crontab, принадлежащий пользователю «root», и этот файл не поддерживает указание пользователя для запуска команды (так как обычно это файл, используемый для планирования личных заданий). Вместо этого
посмотрите, /etc/crontabкакой общесистемный crontab имеет дополнительное поле: поле пользователя . Попробуйте добавить такую ​​строку /etc/crontab:

15 17 * * * nobody /usr/local/bin/bashscript.sh 
Существующая практика везде, где я видел, состоит в том, чтобы выполнять ежедневные задачи обслуживания в crontab root. Я полагаю, что это плохая практика, потому что есть поле для ввода пользователя, под которым должен выполняться cronjob. Я никогда раньше не слышал о / etc / crontab. Это дает лучший ответ, чем мой обходной путь. 14 лет назад 0
на самом деле /etc/cron.d/ кажется предпочтительным местом по сравнению с / etc / crontab. В документации по Ubuntu говорится, что обновления могут повлиять на / etc / crontab. 14 лет назад 3
2
Kitty

su --shell = / bin / bash --session-command = "/ path / to / command -argument = что-то" username &

Работает для меня и не выдает "Этот аккаунт в настоящее время недоступен". ошибка, даже если у пользователя нет действительной оболочки входа

1

На самом деле коготь ложки привел меня к ответу, но позвольте мне создать свой собственный, более полный ответ, чтобы он мог всплыть наверх.

Я не знаю, насколько это распространено, но в некоторой онлайн-документации по Ubuntu говорится, что / etc / crontab может быть перезаписан при обновлении, и предпочтительным решением является создание файла с именем /etc/cron.d/anything (где может быть что угодно, ну что угодно. Любое имя файла)

Я создал файл с именем /etc/cron.d/nobody, и я запускаю сценарии как непривилегированный пользователь. пример строки:

# run the following every day at 01:02 AM 02 01 * * * nobody /usr/local/bin/script-to-run-as-nobody.sh 

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

Кроме того, в целях тестирования мне нужно сначала запустить задание через командную строку. так как у меня есть привилегии sudo, я использую:

$ sudo -u root sudo -u nobody /usr/local/bin/script-to-run-as-nobody.sh 

Если этот сценарий должен выводиться в / dev / stderr или / dev / stdout, выполните следующие действия:

$ chmod o+w /dev/ttyp1 

и сделать:

$ chmod o-w /dev/ttyp1 

когда вы закончите тестирование, чтобы запретить кому-либо отправлять нежелательные сообщения на экран вашего терминала. (используемый вами терминал может отличаться от / dev / tty1, поэтому введите имя пользователя $ ls -ltr / dev / tty * | grep, чтобы узнать, какой из них ваш).

0

Обходной путь вместо реального ответа:

Вы можете добавить комментарий в свой crontab

**#see crontab -u nobody -l for something that runs everyday at 1:15 AM** 

а затем просто добавьте запись для пользователя "nobody" crontab. Я использовал:

**15 1 * * * /usr/local/bin/script.sh #comment** 
0

Обходной путь № 2

Вы можете создать непривилегированного пользователя с оболочкой входа в / etc / passwd

скажем, создайте пользователя с именем "somebody", откажитесь от него sudo, но дайте ему оболочку

Тогда в crontab root должно работать следующее:

15 1 * * * su -c /usr/local/bin/bashscript.sh somebody 

Мне больше нравится ответ / etc / crontab от clawspoon.