我正在编写一个初始化脚本,该脚本应该以不同于root用户的身份执行单个命令。这是我当前的做法:
sudo -u username command
在Ubuntu/Debian上,这通常按预期工作,但在RHEL上,作为 command
执行的脚本会挂起。
是否有其他方法可以以另一个用户身份运行命令?
(请注意,我不能使用lsb init函数,因为它们在RHEL/Centos 5.x上不可用。)
我正在编写一个初始化脚本,该脚本应该以不同于root用户的身份执行单个命令。这是我当前的做法:
sudo -u username command
在Ubuntu/Debian上,这通常按预期工作,但在RHEL上,作为 command
执行的脚本会挂起。
是否有其他方法可以以另一个用户身份运行命令?
(请注意,我不能使用lsb init函数,因为它们在RHEL/Centos 5.x上不可用。)
/etc/rc.d/init.d/functions
脚本旨在提供类似于您所需的功能。如果您在init脚本的顶部引用它,那么所有函数都将可用。daemon
。如果您打算使用它来启动类似守护进程的程序,则简单用法如下:daemon --user=username command
如果这对你的需求来说太过头了,那么可以使用 runuser
(查看完整信息请参阅 man runuser
;一些版本可能需要在用户名之前加上-u
):
/sbin/runuser username -s /bin/bash -c "command(s) to run as user username"
runuser
命令不接受-u
参数,我们需按照以下方式运行:runuser username -s /bin/bash -c "command"
。其中username
是要切换到的用户,"command"
是要执行的命令。 - Richlv-u
参数,否则命令会失败。而/sbin/runuser username -s /bin/bash -c "command"
可以正常工作。 - Hustlionrunuser -u username -- command
。 - J. Titus对于systemd风格的init脚本来说,这非常简单。您只需在[Service]部分中添加User=。
这是我在CentOS 7上使用的qbittorrent-nox init脚本:
[Unit]
Description=qbittorrent torrent server
[Service]
User=<username>
ExecStart=/usr/bin/qbittorrent-nox
Restart=on-abort
[Install]
WantedBy=multi-user.target
不要使用 sudo,尝试使用
su - username command
根据我的经验,在 RHEL 系统中并不总是有 sudo,但是有su,因为 su 是 coreutils 包的一部分,而 sudo 在 sudo 包中。
sudo -u <username> <command>
不需要密码。请注意,我是使用我的用户账户而非 root 账户运行这些命令的。 - Justin Csu -m username command
- bmaupin如果你有start-stop-daemon
start-stop-daemon --start --quiet -u username -g usergroup --exec command ...
start-stop-daemon
是 Debian 的特有命令。 - Ansgar Wiechers-u/--user
用于检查,您应该添加 -c/--chuid
:在启动进程之前切换到此用户名/用户ID。 - Tanky Woo我通常采用你所做的方式(即sudo -u用户名命令),但也有" djb "运行守护进程以另一个用户特权的方法。参见: http://thedjbway.b0llix.net/daemontools/uidgid.html
我添加了这个答案,因为我不得不查找多个地方来实现我的用例。 我有一个在启动时运行的脚本。此脚本以特定(无密码)用户身份运行进程,并在多个Linux版本上运行。以下是不同版本的选项: (我以Java作为目标进程为例)
1. RHEL / CentOS 6:
source /etc/rc.d/init.d/functions
daemon --user=myUser $JAVA_HOME/bin/java
2. RHEL 7 / SUSE12 / 其他使用systemd的Linux版本:
在您的systemd单元文件中添加:
User=myUser
3. Suse 11:
/sbin/startproc -u myUser $JAVA_HOME/bin/java