我已经在我的新 CentOS 7 机器上安装了 ircd-hybrid,我可以通过我的普通用户运行它,但我想以较低的权限作为自己的用户运行它(即,在 /etc/ircd 之外没有写访问权限)。经过几个小时的反复试验和谷歌,我找到了这些方法:
su - <user> -c <command>
这会失败,因为我想以没有 shell 或密码的用户身份运行,例如“nobody”,并且这需要密码(因此总是失败)。
daemon --user=<user> <command>
这会失败,因为“daemon”是 中的函数/etc/init.d/functions
,而不是命令,因此在通过 sudo (运行脚本所必需的)或启动脚本运行时找不到它。
runuser -u <user> <command>
sudo -u <user> <command>
这些很接近,据我所知,工作方式相同。如果我在没有选项的情况下运行,它会起作用:
sudo -u nobody '/etc/ircd/ircd'
但因为它没有配置文件,所以 ircd 会立即退出,或者至少我认为这就是发生的情况。 ps -aux | grep irc
即使以普通用户身份运行,也仅返回 grep 进程。
sudo -u nobody '/etc/ircd/ircd -configfile /etc/ircd/ircd.conf -logfile /var/log/ircd/ircd.log'
但是,如果有 1 个或两个参数,则返回:
sudo: /etc/ircd/ircd -configfile /etc/ircd/ircd.conf -logfile /var/log/ircd/ircd.log: command not found
如果我运行相同的命令 minus sudo -u nobody
,它会完全按照预期工作。
我错过了什么?为什么在该死的地狱中以另一个用户身份启动守护进程如此困难?
更新:感谢 Arthur2e5 的评论,这可以作为以“nobody”身份启动守护进程的直接命令(省略引号):
sudo -u nobody /etc/ircd/bin/ircd -configfile /etc/ircd/ircd.conf -logfile /var/log/ircd/ircd.log
但是,我最初的目标是将其作为启动脚本运行,并且 sudo 不是那里的选项 ( Jun 13 07:03:00 coldcandor.com sudo[5335]: sudo: sorry, you must have a tty to run sudo
)。在这种情况下, runuser 似乎是唯一的方法,但如果我以同样的方式尝试,我会得到:
$ runuser -u nobody /etc/ircd/bin/ircd -configfile /etc/ircd/ircd.conf -logfile /var/log/ircd/ircd.log
runuser: invalid option -- 'o'
Usage:
runuser [options] -u <USER> COMMAND
runuser [options] [-] [USER [arg]...]
尝试替代语法没有帮助(当从 root 帐户运行时,因为 runuser 需要 root 才能运行):
$ runuser - nobody /etc/ircd/bin/ircd -configfile /etc/ircd/ircd.conf -logfile /var/log/ircd/ircd.log
runuser: invalid option -- 'o'
$ runuser - nobody '/etc/ircd/bin/ircd -configfile /etc/ircd/ircd.conf -logfile /var/log/ircd/ircd.log'
This account is currently not available.
最后一点魔法是什么?
答案1
更多地使用替代语法,以及再次深入研究手册页,我找到了 -s 选项。哈利路亚!它作为启动服务运行!
/sbin/runuser -s /bin/sh - nobody -c '/etc/ircd/bin/ircd -configfile /etc/ircd/ircd.conf -logfile /var/log/ircd/ircd.log'
我唯一担心的事情是:如果我现在强迫任何人都使用 shell 运行,是否会降低安全性?似乎不会,并且手册页中没有警告。
请注意,我意识到这不允许写入日志文件,因此我创建了一个名为 irc 的新用户:组,该组拥有 /var/log/ircd 目录,将 home 设置为 /etc/ircd,并将 shell 设置为到 /sbin/nologin。