我有一个简单的 init.d 脚本,用于启动和停止进程。我将 init.d 称为 root,但我希望它控制的进程以特定用户身份运行。
网上最常见的建议似乎是
su myuser -c "my_process args"
然而,这创建了第二个进程空间、新的外壳等,并且有些不优雅。
我更喜欢使用exec()
,因为它取代了 shell,但这并不需要用户作为参数。这是我应该setuid()
首先使用的情况吗?设置gid怎么样?有什么需要注意的问题吗?
或者,是否有特定于发行版的解决方案以不同用户身份运行 init.d ?我的环境是Centos 6.4。
答案1
取决于发行版,但基于 RHEL 的发行版使用它们源自的 Bash 函数,/etc/rc.d/init.d/functions
该daemon
函数本身只是runuser
命令的包装器。从我在源文件中可以看出,它在功能上与su
大多数情况下相同,只是不经过 PAM(可能是为了避免在某些情况下出现先有鸡还是先有蛋的问题)。
这并不能真正回答你的反对意见,但服务就是这样做的。您想要的整洁和整体逻辑一致性是诸如此类的动机的一部分systemd
答案2
使用su someuser -c ...
就是所需要的。对于初学者来说,setuid()
是 shell 代码无法使用的系统调用。不要让这件事变得比需要的更困难。