如何在初始化脚本中以特定用户身份运行命令?
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 <username> <command>
没有。请注意,我使用我的用户帐户运行这些,而不是 root 帐户。
如果在 /etc/sudoers 中设置了 requiretty
,sudo 将不起作用(默认值在 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 中不可用。 @ddariostart-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 应用程序?
如何在 ubuntu 14.04 上运行的 ruby 中以编程方式解压缩 .tar.xz 文件(没有中间体)?