Используя CentOs, я хочу запустить сценарий как «обучение» пользователя как системную службу. Я использую daemontools для наблюдения за процессом, которому нужен сценарий запуска, который запускается от имени пользователя root и не имеет стандарта tty в.
Ниже я привожу свои пять разных попыток, но все они не удались.
:
#!/bin/bash
exec >> /var/log/training_service.log 2>&1
setuidgid training training_command
Эта последняя строка недостаточно хороша, так как для training_command нам нужна среда для настройки пользователя trqaining.
:
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), но я не хочу и не уверен в последствиях.
:
sudo -u training -i bash -c 'source $HOME/.bashrc; training_command'
Вариация на ту же тему: 'sudo: sorry, you must have a tty to run sudo
'
:
runuser - training -c 'training_command'
Это дает runuser: cannot set groups: Connection refused
. Я не нашел смысла или разрешения этой ошибки.
:
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.
настроить ключ ssh для входа в систему без пароля для другого пользователя. Вот руководство для этой цели: https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys--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.