Бывает так, что возникает необходимость поменять пользователя, от имени которого Systemd запускает процесс. Например, если установить TorrServer в Arch Linux, то по умолчанию процесс TorrServer запускается от имени пользователя root, что нежелательно и даже опасно. В этой небольшой заметке будет идти речь о том, как поменять в юните Systemd пользователя, от имени которого запускается процесс.
Итак, чтобы сменить пользователя в юните Systemd, нам нужно его (юнит) отредактировать. Для примера, будем редактировать юнит TorrServer. Открываем юнит для редактирования:
sudo systemctl edit torrserver.service
Видим следующее содержимое:
### Editing /etc/systemd/system/torrserver.service.d/override.conf
### Anything between here and the comment below will become the contents of the drop-in file
### Edits below this comment will be discarded
### /usr/lib/systemd/system/torrserver.service
# [Unit]
# Description = TorrServer
# After = syslog.target network.target nss-lookup.target
#
# [Service]
# Type = simple
# Environment="GODEBUG=madvdontneed=1"
# ExecStart = /usr/bin/torrserver -d /var/lib/torrserver
# ExecReload = /bin/kill -HUP ${MAINPID}
# ExecStop = /bin/kill -INT ${MAINPID}
# TimeoutSec = 30
# Restart = on-failure
# LimitNOFILE = 4096
#
# [Install]
# WantedBy = multi-user.target
Как видно, в нижней части в закомментированном виде находится оригинальное содержимое файла юнита. Фраза «Edits below this comment will be discarded» говорит нам о том, что все правки, которые будут осуществлены после этой строчки будут отклонены. Чтож, будем вносить правки до неё.
Чтобы сменить пользователя, от имени которого юнит Systemd будет запускать процесс, в секцию [Service] нужно добавить строку User= с именем пользователя, от которого будет запускаться процесс юнитом. Добавляем строки в юнит не забывая о том, что разместить их нужно выше той строчки. Теперь файл выглядит так:
### Editing /etc/systemd/system/torrserver.service.d/override.conf
### Anything between here and the comment below will become the contents of the drop-in file
[Service]
User=imatvey
### Edits below this comment will be discarded
### /usr/lib/systemd/system/torrserver.service
# [Unit]
# Description = TorrServer
# After = syslog.target network.target nss-lookup.target
#
# [Service]
# Type = simple
# Environment="GODEBUG=madvdontneed=1"
# ExecStart = /usr/bin/torrserver -d /var/lib/torrserver
# ExecReload = /bin/kill -HUP ${MAINPID}
# ExecStop = /bin/kill -INT ${MAINPID}
# TimeoutSec = 30
# Restart = on-failure
# LimitNOFILE = 4096
#
# [Install]
# WantedBy = multi-user.target
Сохраняем изменения в файле юнита и перезапускаем сервис:
sudo systemctl restart torrserver.service
Готово. Теперь процесс, запущенный сервисом, юнит которого мы отредактировали, будет запускаться от указанного нами пользователя.