1

Используя CentOs, я хочу запустить скрипт как «обучение» пользователя как системный сервис. Я использую daemontools для мониторинга процесса, который требует запуска сценария запуска от имени пользователя root:

  1. :

    #!/bin/bash
    exec >> /var/log/training_service.log 2>&1
    setuidgid training training_command
    

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

  2. :

    su - training -c 'training_command' 
    

    выдает ' standard in must be tty ', так как оно гарантирует наличие tty для потенциального принятия пароля Я знаю, что мог бы заставить это исчезнуть, изменив скрипт /etc /sudoers a la Bash & 'su', выдающий ошибку "стандарт должен быть tty", но я неохотно и не уверен в последствиях.

  3. :

    runuser - training -c 'training_command' 
    

    дает runuser: cannot set groups: Connection refused . Я не нашел никакого смысла или разрешения для этого сообщения.

  4. :

    ssh -p100 training @ localhost 'source $ HOME /.bashrc; training_command»

Мне не удалось Host key verification failed. (ключ хоста находится в known_hosts и т. д.).

Примечание: все 2,3,4 работают должным образом, если я запускаю скрипт-обертку из корневой оболочки. проблемы возникают только в том случае, если монитор системного сервиса (daemontools) запускает его (нет терминала tty, я думаю).

Я застрял. Это так трудно достичь?

Я ценю все понимание и руководство для наилучшей практики.

2 ответа2

2

Источник среды в вашем скрипте запуска, если решение Mugen Kenichi не вариант. У меня есть несколько сценариев запуска, которые используют подход Mugen и другие, которые исходной среды непосредственно в сценарии. Часто это просто вопрос предпочтений. Получение среды непосредственно в сценарии запуска более прозрачно для других пользователей, которые могут редактировать сценарий (или через 6 месяцев).

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

#!/bin/bash
. /my/tools/environment/apps/apps_rc
. /my/tools/environment/functions/common.bash 

Как только это будет сделано, используйте su как обычно, чтобы запустить процесс в качестве пользователя.

Вот пример того, как я запускаю похожие процессы, используя su .

su -l $USER -c "nohup $APP_PATH" >> $LOG_FILE 2>&1 < /dev/null &

В качестве опции вы также можете посмотреть на пакет daemonize . Я тоже немножко пользуюсь.

В заключение...

Как видно из вашего вопроса, кажется, что вы, возможно, захотите запустить скрипт как привилегированный пользователь, вам может понадобиться установить бит setuid в скрипте, чтобы он мог запускаться от имени root при обычном использовании. Это может иметь последствия для безопасности, поэтому знайте, что вы делаете, когда вы делаете это.

1

Вам нужно будет отключить параметр requiretty в /etc/sudoers для пользователя root . Добавьте следующую строку через visudo:

Defaults:root !requiretty

Вам также понадобится следующая строка в /etc/sudoers чтобы root мог делать все (это должно быть включено по умолчанию, но обязательно убедитесь):

root ALL=(ALL) ALL

Тогда вы можете сделать следующее:

sudo -u training /path/to/training_command

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