По умолчанию службы запускаются во root
время загрузки на моем RHEL-сервере. Если я правильно помню, то же самое верно и для других дистрибутивов Linux, которые используют сценарии инициализации в /etc/init.d
.
Как вы думаете, как лучше всего запустить процессы от имени (статического) пользователя по моему выбору?
Единственный метод, к которому я пришел, - это использовать что-то вроде:
su my_user -c 'daemon my_cmd &>/dev/null &'
Но это кажется немного неопрятным ...
Есть ли какая-то магия, которая обеспечивает простой механизм автоматического запуска служб от имени других пользователей без полномочий root?
РЕДАКТИРОВАТЬ: Я должен был сказать, что процессы, которые я запускаю в этом случае, являются либо сценариями Python, либо программами Java. Я бы предпочел не писать вокруг них родную оболочку, поэтому, к сожалению, я не могу вызвать setuid (), как предлагает Блэк .
Ответы:
В Debian мы используем
start-stop-daemon
утилиту, которая обрабатывает pid-файлы, меняет пользователя, переводит демон в фоновый режим и многое другое.Я не знаком с RedHat, но
daemon
утилита, которую вы уже используете (которая определена в/etc/init.d/functions
, btw.), Везде упоминается как эквивалентstart-stop-daemon
, так что либо она может изменить uid вашей программы, либо способ, которым вы это делаете. это уже правильный.Если посмотреть в сети, есть несколько готовых оберток, которые можно использовать. Некоторые из них могут быть уже упакованы в RedHat. Взгляните
daemonize
, например.источник
/etc/init.d/skeleton
. Добавить переменные UID, GID иdo_start()
использовать:start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --chuid $UID:$GID -- $DAEMON_ARGS
daemon()
он определен/etc/rc.d/init.d/function
как в моих RHEL, так и в CentOS.Изучив все предложения здесь, я обнаружил несколько вещей, которые, надеюсь, будут полезны другим на моем месте:
hop правильно указывает мне на
/etc/init.d/functions
:daemon
функция уже позволяет вам установить альтернативного пользователя:Это реализуется заключением вызова процесса в оболочку
runuser
- подробнее об этом позже.Джонатан Леффлер прав: в Python есть setuid:
Однако я все еще не думаю, что вы можете установить uid из JVM.
Ни один,
su
ниrunuser
изящный способ не обработать случай, когда вы просите запустить команду от имени пользователя, которым вы уже являетесь. Например:Чтобы обойти такое поведение
su
иrunuser
, я изменил свой сценарий инициализации на что-то вроде:Спасибо всем за помощь!
источник
Если вы собираетесь написать свой собственный демон, я рекомендую вызвать setuid (). Таким образом, ваш процесс может
источник
Просто чтобы добавить еще кое-что, на что следует обратить внимание:
источник
на виртуальной машине CENTOS (Red Hat) для svn server: отредактировано,
/etc/init.d/svnserver
чтобы изменить pid на то, что svn может писать:и добавлена опция
--user=svn
:Исходный файл pidfile был
/var/run/svnserve.pid
. Демон не запустился, потому что только root мог писать туда.источник
На что следует обратить внимание:
Обычно я использую / sbin / su для переключения на соответствующего пользователя перед запуском демонов.
источник
Почему бы не попробовать следующее в сценарии инициализации:
У меня это сработало.
источник
setuid: command not found
Мне нужно было запустить приложение Spring .jar как службу, и я нашел простой способ запустить его от имени конкретного пользователя:
Я изменил владельца и группу своего jar-файла на пользователя, от имени которого я хотел работать. Затем сделал символическую ссылку на эту банку в init.d и запустил службу.
Так:
источник