如何在Linux中以特定用户和组的身份运行systemd服务

时间:2020-02-23 14:40:23  来源:igfitidea点击:

默认情况下,大多数systemd服务都配置为由root用户运行,但是还有一个选项可以创建自定义systemd服务单元文件并以特定用户或者组或者两者的身份运行。
因此,在本文中,我们将检查并验证使用CentOS/RHEL 7/8 Linux环境以特定用户和组身份运行systemd服务的步骤。

我已经在Linux服务器上安装了Oracle VirtualBox,在该服务器上我将使用带有RHEL/CentOS 7/8的虚拟机来验证本文中的步骤。

第1步:systemd概述

希望我们已经熟悉以下主题

  • systemd概述以及它与旧版SysV脚本的区别

  • 如何在Linux中创建systemd单位文件

建立使用者和群组

现在,这是一个可选步骤,假设我们已经为下一步准备好用户和组。
但是,如果我们不这样做,则可以按照本文创建新用户,并将自定义组(主要或者次要)分配给相应的用户。

  • 如何在Linux中不使用useradd命令创建新用户

  • 在Linux或者Unix中将用户添加到组或者从组(主要或者辅助)中删除用户的步骤

其中我已经创建了一个用户" hynman",该用户是" hynman"和管理员组的一部分

[root@centos-8 ~]# useradd hynman
[root@centos-8 ~]# passwd hynman  <-- Here the screen will prompt to assign a new password

验证任何用户的组

[root@centos-8 ~]# id hynman
uid=1000(hynman) gid=1000(hynman) groups=1000(hynman),1001(admin)

因此,我们希望创建一个systemd服务单元文件,并以特定的用户和组身份运行systemd服务,对我们来说,这将是admin组的hynman用户部分。

创建示例脚本

我们将使用旧文章中的启动脚本进行一些调整,以在Linux中以特定用户和组的身份检查和运行systemd服务

[root@centos-8 ~]# cat /tmp/startup_script.sh
#!/bin/bash
if [[ `id -nu` != "hynman" ]];then
   echo "Not hynman user, exiting.."
   exit 1
fi
SCRIPT_NAME=$(basename -- "
[root@centos-8 ~]# chown hynman:hynman /tmp/startup_script.sh
") z=0 for i in {1..3}; do sleep 1m ((z++)) echo "$SCRIPT_NAME: finished minute ${z}" >> /tmp/file done echo "$SCRIPT_NAME: COMPLETELY FINISHED" >> /tmp/file

因此,在此脚本中,我们为用户添加了显式检查,因此,除非执行脚本的用户是hynman,否则脚本将无法执行。
如果成功,脚本将以1分钟的间隔继续在/tmp/file中写入3分钟。
这也我们确保脚本在完成定义的任务之前不会退出

将脚本文件的所有权更改为hynman

[root@centos-8 ~]# chmod u+x /tmp/startup_script.sh
[root@centos-8 ~]# ls -l /tmp/startup_script.sh
-r-xr--r-- 1 hynman hynman 304 Jan 17 01:58 /tmp/startup_script.sh

提供脚本的可执行权限

[root@centos-8 ~]# /tmp/startup_script.sh
Not hynman user, exiting..

我们将手动执行脚本,以确保其可以正常工作

[root@centos-8 ~]# cat /etc/systemd/system/run-as-user.service
[Unit]
Description=Run service as user hynman
DefaultDependencies=no
After=network.target
[Service]
Type=simple
User=hynman
Group=admin
ExecStart=/tmp/startup_script.sh
TimeoutStartSec=0
RemainAfterExit=yes
[Install]
WantedBy=default.target

创建单元文件以特定用户和组身份运行systemd服务

现在,如第1步中突出显示的那样,我已经写了另一篇文章,其中包含创建新的systemd单元文件的步骤。

其中我们将在/etc/systemd/system下的systemd单元文件命名为run-as-user.service。
以下是" run-as-user.service"的内容

[root@centos-8 ~]# systemctl daemon-reload

其中我们定义了" User = hynman"和" Group = admin",以确保仅以用户" hynman"(属于" admin"组)的身份执行脚本。
如果环境需要,我们还可以使用许多其他指令,例如WorkingDirectoryEnvironmentFile等。
有关更多信息,请查看systemd.exec的手册页。

刷新systemd配置文件

[root@centos-8 ~]# systemctl enable run-as-user.service
Created symlink /etc/systemd/system/shutdown.target.wants/run-as-user.service → /etc/systemd/system/run-as-user.service.

接下来,启用服务(如果需要)以在启动时自动启动

[root@centos-8 ~]# systemctl restart run-as-user.service

验证systemd单元文件配置

现在,既然我们完成了systemd的设置。
让我们验证我们的配置。
在开始之前,我已经清除了/tmp/file的内容,这是我们的脚本/tmp/startup_script.sh在每分钟3分钟内放置虚拟内容的地方。

我们将仅启动run-as-user.service运行时,因为不需要重新启动即可在此处验证配置:

[root@centos-8 ~]# systemctl status run-as-user.service
● run-as-user.service - Run service as user hynman
   Loaded: loaded (/etc/systemd/system/run-as-user.service; enabled; vendor preset: disabled)
   Active: active (exited) since Fri 2017-01-17 02:09:32 IST; 2h 31min ago
  Process: 24113 ExecStart=/tmp/startup_script.sh (code=exited, status=0/SUCCESS)
 Main PID: 24113 (code=exited, status=0/SUCCESS)
Jan 17 02:09:32 centos-8.example.com systemd[1]: Started Run service as user hynman.

接下来检查服务状态

[root@centos-8 ~]# ps -ef | grep startup
hynman   26877     1  0 04:42 ?        00:00:00 /bin/bash /tmp/startup_script.sh
root     26890  7625  0 04:42 pts/0    00:00:00 grep --color=auto startup

看起来一切都很好,因为我们能够以特定用户和组身份运行systemd服务,我们可以使用以下命令检查" ps"状态以确保我们的脚本正在运行:

[root@centos-8 ~]# cat /tmp/file
startup_script.sh: finished minute 1
startup_script.sh: finished minute 2
startup_script.sh: finished minute 3
startup_script.sh: COMPLETELY FINISHED

现在,我们可以按照脚本中的配置监视几分钟内的/tmp/file内容。

##代码##