如何在Linux中以特定用户和组的身份运行systemd服务
默认情况下,大多数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"组)的身份执行脚本。
如果环境需要,我们还可以使用许多其他指令,例如WorkingDirectory
,EnvironmentFile
等。
有关更多信息,请查看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内容。
##代码##