2013-07-30 4 views
24

Я пишу сценарий init, который должен выполнять одну команду как пользователь, отличный от root. Вот как я это делаю в данный момент:
sudo -u username commandКак запустить команду в качестве конкретного пользователя в сценарии инициализации?

Как правило, это работает, как ожидалось на Ubuntu/Debian, но на RHEL скрипт, который выполняется как command зависаний.
Есть ли другой способ запустить команду в качестве другого пользователя?
(Обратите внимание, что я не могу использовать функции инициализации lsb, поскольку они недоступны на RHEL/Centos 5.x.)

+2

Обратите внимание, что этот вопрос о чем-то создан исключительно администратором (обычно, демон, который работает как некий пользователь в целях безопасности). Немного отличается случай, когда пользователи настраивают свои собственные команды для запуска при загрузке с помощью своего пользователя crontab. См. Http://askubuntu.com/questions/260845/run-a-command-as-user-at-boot-time-ubuntu-12-04 –

ответ

15

В системах RHEL, то /etc/rc.d/init.d/functions скрипт предназначен для обеспечения похожа на то, что вы хотите. Если вы указали, что в верхней части сценария инициализации, все его функции становятся доступными.

Конкретная функция, предоставляемая для помощи в этом daemon. Если вы намерены использовать его для запуска демона, как программы, простое использование будет:

daemon --user=username command 

Если это слишком тяжеловесное за то, что вам нужно, есть runuser (см man runuser для полной информации; в некоторых версиях, возможно, потребуется -u до пользователя):

/sbin/runuser username -s /bin/bash -c "command(s) to run as user username" 
+4

, по крайней мере, на RHEL6, 'runuser' не принимает параметр' -u', и он запускает его так: 'runuser username -s/bin/bash - c "command" ' – Richlv

+0

Для Centos 7 также не следует использовать' -u' или команда не работает. И команда '/ sbin/runuser username -s/bin/bash -c" команда "' работает. – Hustlion

10

Если у вас есть старт-стоп-демон

start-stop-daemon --start --quiet -u username -g usergroup --exec command ... 
+3

Он не доступен в RHEL 5. – ddario

+2

@ddario 'start-stop- daemon' является Debian-ism. –

+0

Вы можете использовать 'daemon', как указал @lagweezle в его/ее [ответе] (http://stackoverflow.com/a/31616592/120794). Кстати, это должен быть принятый ответ. –

12

Вместо Судо, попробуйте

su - username command 

По моему опыту, Судо не всегда доступны в системах RHEL , но su есть, потому что su является частью пакета coreutils, тогда как sudo находится в пакете sudo.

+6

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

+0

sudo wont work, если 'requiretty' установлен в/etc/sudoers (по умолчанию в процентах 6, 7 и fedora 20). – spuder

+0

Такая же проблема здесь, не подходит пользователю, потому что для этого требуется пароль. Итак, каков наилучший подход для этого? Кажется, у кого-то нет правильного ответа :( – gromit190

10

Для сценариев инициализации стиля systemd это очень просто. Вы просто добавляете User = в раздел [Сервис].

Вот сценарий инициализации я использую для qbittorrent оксидов азота на CentOS 7:

[Unit] 
Description=qbittorrent torrent server 

[Service] 
User=<username> 
ExecStart=/usr/bin/qbittorrent-nox 
Restart=on-abort 

[Install] 
WantedBy=multi-user.target 
+1

systemd может быть спорным, но это, безусловно, приятно Я хочу сделать это для моего (hashicorp) сервера хранилища. спасибо. – David

+0

Я действительно не соглашаюсь с linux dev драмой :) Я только что нашел systemd с этим легко справиться, поскольку Centos его принял. Я никогда не вернусь к беспорядку, который ему предшествовал :) – LOAS

Смежные вопросы