Назад | Перейти на главную страницу

запустить скрипт от имени другого пользователя из корневого скрипта без tty stdin

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

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

  1. :

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

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

  2. :

    su - training -c 'training_command' 
    

    Это похоже на то (Запустить сценарий оболочки от имени другого пользователя) но дает 'standard in must be tty'as su убедившись, что tty присутствует, чтобы потенциально принять пароль. Я знаю, что могу заставить это исчезнуть, изменив / etc / sudoers (а-ля https://superuser.com/questions/119376/bash-su-script-giving-an-error-standard-in-must-be-a-tty), но я не хочу и не уверен в последствиях.

  3. :

    sudo -u training -i bash -c 'source $HOME/.bashrc; training_command'
    

    Вариация на ту же тему: 'sudo: sorry, you must have a tty to run sudo'

  4. :

    runuser - training -c 'training_command'  
    

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

  5. :

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

    Это больше похоже на шутку, чтобы показать отчаяние. Даже у этого не получается Host key verification failed. (ключ хоста IS в known_hosts и т. д.).

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

Я застрял. Неужели этого так сложно достичь?

Я ценю любую информацию и рекомендации по передовой практике.

(это также было размещено на суперпользователе: https://superuser.com/questions/434235/script-calling-script-as-other-user)

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

Defaults:root !requiretty

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

root ALL=(ALL) ALL

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

sudo -u training /path/to/training_command

По сути, это частный случай этот вопрос; мы можем использовать script -c чтобы подделать tty. Единственная проблема в том, что я не могу заставить этот трюк работать напрямую с su по какой-то причине и sudo немного некрасиво, если вам действительно нужно исходить ~/.bashrc перед training_command. Пытаться:

echo password | script -c "sudo su - training -c training_command" 

Под SSH вы можете запустить команду foo.sh в обычном пользователе:

$ ssh normal_user@1.2.3.4 bash /path/to/foo.sh

если один из foo.shкоманде нужны привилегии root, например, netstat, заверните это в su такую ​​команду (замените исходный необработанный netstat -tunple):

su -c "netstat -tunpl" root

и беги foo.sh как это:

$ ssh -t normal_user@1.2.3.4 bash /path/to/foo.sh

Это запросит пароль для буксировки, первый для normal_user, а второй - для root.

Плагиат мой ответ здесь: Запуск сценария от имени другого пользователя

Вы можете использовать start-stop-daemon примерно так:

/sbin/start-stop-daemon --background --start --exec /path/to/training.sh --user training --pidfile=/path/to/training.pid --make-pidfile

где training.sh выглядит примерно так:

#!/bin/sh
exec >> /var/log/training_service.log 2>&1
source /home/training/.bashrc
training_command

Выберите первый и установите нужные вам переменные среды.

Если вы уже используете daemontools, вы не создаете файлы журнала и не вносите в них никаких изменений вручную. Daemontools сделает эту работу за вас.

Это сценарий для сценария запуска приложения.

#!/bin/bash
exec 2>&1
exec setuidgid training sh -c 'YOURVARIABLE=yourvalue exec training_command'

Затем вы создаете log Сценарий выполнения каталога с собственным сценарием выполнения.

Обратитесь к этой записи для настройки журнала: http://cr.yp.to/daemontools/faq/create.html#runlog

Запустите вашу команду с SSH.

  1. настроить ключ ssh для входа в систему без пароля для другого пользователя. Вот руководство для этой цели: https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys--2

  2. Выполните команду с ssh: ssh -l training -i key_file "training_command"

Попробуй это:

#!/bin/bash
sudo -u training training_command > /var/log/training_service.log 2>&1

Если это не удалось, опубликуйте вывод /var/log/training_service.log.