如何在初始化脚本中以特定用户身份运行命令?

Posted

技术标签:

【中文标题】如何在初始化脚本中以特定用户身份运行命令?【英文标题】:How to run a command as a specific user in an init script? 【发布时间】:2013-07-31 03:19:38 【问题描述】:

我正在编写一个初始化脚本,它应该以不同于 root 的用户身份执行单个命令。这就是我目前的做法:sudo -u username command

这通常在 Ubuntu/Debian 上按预期工作,但在 RHEL 上,作为 command 执行的脚本挂起。 是否有其他方法可以以其他用户身份运行命令? (请注意,我不能使用 lsb init 函数,因为它们在 RHEL/Centos 5.x 上不可用。)

【问题讨论】:

请注意,这个问题是关于由管理员专门设置的东西(通常是一个以某些用户身份运行以确保安全的守护程序)。稍微不同的情况是用户使用他们的用户 crontab 设置自己的命令以在启动时运行。见askubuntu.com/questions/260845/… 【参考方案1】:

添加此答案是因为我必须查找多个位置才能实现我的用例。 我有一个在启动时运行的脚本。此脚本以特定(无密码)用户身份运行进程,并在多种 linux 版本上运行。以下是不同口味的选择: (我以java作为目标进程为例)

1. RHEL / CentOS 6:

source /etc/rc.d/init.d/functions
daemon --user=myUser $JAVA_HOME/bin/java

2。使用 systemd 的 RHEL 7 / SUSE12 / 其他 linux 风格:

在你的 systemd 单元文件中添加:

User=myUser

3.苏塞 11:

/sbin/startproc -u myUser $JAVA_HOME/bin/java

【讨论】:

【参考方案2】:

在 RHEL 系统上,/etc/rc.d/init.d/functions 脚本旨在提供与您想要的类似的内容。如果您在初始化脚本的顶部获取它,则它的所有功能都可用。

提供帮助的具体功能是daemon。如果你打算用它来启动一个类似守护进程的程序,一个简单的用法是:

daemon --user=username command

如果这对您的需要来说过于严厉,可以使用runuser(有关完整信息,请参阅man runuser;某些版本可能需要在用户名之前使用-u):

/sbin/runuser username -s /bin/bash -c "command(s) to run as user username"

【讨论】:

至少在 RHEL6 上,runuser 不接受 -u 参数,人们会像这样运行它:runuser username -s /bin/bash -c "command" 对于 Centos 7,也不应该使用-u 否则命令会失败。 /sbin/runuser username -s /bin/bash -c "command" 有效。 对于处理错误options --(shell,fast,command,session,session-command,login) and --user are mutually exclusive 的任何人,以下格式对我有用:runuser -u username -- command 感谢@lagweezle,这似乎对我启动命令有用,停止该守护进程的最佳方法是什么?在我的 init.d 脚本的停止部分?【参考方案3】:

对于 systemd 风格的初始化脚本来说,这真的很简单。您只需在 [Service] 部分添加一个 User=。

这是我在 CentOS 7 上用于 qbittorrent-nox 的初始化脚本:

[Unit]
Description=qbittorrent torrent server

[Service]
User=<username>
ExecStart=/usr/bin/qbittorrent-nox
Restart=on-abort

[Install]
WantedBy=multi-user.target

【讨论】:

systemd 可能会引起争议,但这无疑是一个很好的便利。我将为我的 (hashicorp) 保险库服务器进程执行此操作。谢谢。 我真的跟不上 linux 开发大戏 :) 我刚刚发现 systemd 很容易处理,因为 centos 采用了它。我永远不会回到之前的烂摊子:)【参考方案4】:

sudo 代替,试试

su - username command

根据我的经验,sudo 在 RHEL 系统上并不总是可用,但 su 是,因为 su 是 coreutils 包的一部分,而sudo 在 sudo 包中。

【讨论】:

我试过这个,但它需要服务用户的密码,我不打算设置。另一方面,sudo -u &lt;username&gt; &lt;command&gt; 没有。请注意,我使用我的用户帐户运行这些,而不是 root 帐户。 如果在 /etc/sudoers 中设置了 requirettysudo 将不起作用(默认值在 cent 6、7 和 fedora 20 中)。 同样的问题,不能使用 su 因为它需要密码。那么最好的方法是什么?似乎没有人有正确的答案:( 这在 RHEL 6 上对我有用。我还使用 -m 标志来保留环境变量:su -m username command【参考方案5】:

如果你有启动-停止-守护进程

start-stop-daemon --start --quiet -u username -g usergroup --exec command ...

【讨论】:

在 RHEL 5 中不可用。 @ddario start-stop-daemon 是 Debian 主义。 您可以使用daemon,正如@lagweezle 在他/她的answer 中指出的那样。顺便说一句,这应该是公认的答案。 -u/--user 用于检查,您应该添加-c/--chuid:在开始该过程之前更改为此用户名/uid【参考方案6】:

我通常按照您的方式进行操作(即 sudo -u username 命令)。但是,还有一种“djb”方式来运行具有其他用户权限的守护程序。见:http://thedjbway.b0llix.net/daemontools/uidgid.html

【讨论】:

以上是关于如何在初始化脚本中以特定用户身份运行命令?的主要内容,如果未能解决你的问题,请参考以下文章

如何以 root 身份运行 Perl 脚本但仍会影响用户 gconf 设置

如何在 IntelliJ 中以不同用户身份运行 JAR 应用程序?

如何检查是不是在 bash 脚本中以 root 身份运行

如何在 ubuntu 14.04 上运行的 ruby​​ 中以编程方式解压缩 .tar.xz 文件(没有中间体)?

在 Tomcat 中以不同用户身份运行不同的 Web 应用程序

windows 中的类似于sudo的命令(在cmd中以另一个用户的身份运行命令)