3

Это на машине 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-фу не очень помогает.

5 ответов5

6

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

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

15 17 * * * nobody /usr/local/bin/bashscript.sh
2

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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .