为啥我必须 sudo 来自守护进程的命令?
Posted
技术标签:
【中文标题】为啥我必须 sudo 来自守护进程的命令?【英文标题】:Why I have to sudo a command from daemon process?为什么我必须 sudo 来自守护进程的命令? 【发布时间】:2015-05-23 09:33:04 【问题描述】:我对@987654322@ 有疑问。
我从一个守护进程调用一个 Erlang 脚本。 (这个守护进程是由xinetd定义的,这个进程会在里面执行一个bash脚本,我把我的Erlang脚本命令写进了bash脚本)。 Erlang 脚本是这样的:
#! /usr/bin/env escript
main(_) ->
ok.
脚本很简单,在shell命令行下执行就ok了。
但是当我从 守护进程 调用它时,它失败了,返回码非零。我真的不知道。
当我尝试sudo /path/to/my/erlang_script
时,一切正常!!
我自己就是root
。为什么一定要加sudo
?
我的 xinetd conf 是这样的:(如您所见,“用户”设置为“root”)
service gtpgwagent
type = UNLISTED
flags = REUSE
disable = no
socket_type = stream
protocol = tcp
wait = no
user = root
instances = UNLIMITED
server = /lab/subsysserv/sbin/in.gtpgwagent
server_args = gtpgw
log_type = FILE /tmp/ggsnagent_logfile
log_on_success += DURATION USERID HOST EXIT
log_on_failure += USERID HOST
env = /usr/bin:/bin
port = 1761
【问题讨论】:
“失败,返回码为 0”是什么意思?进程退出代码 0means success(与 C 相反)。 @thatotherguy,对不起,错字...不是零 【参考方案1】:守护进程既不是以 root 身份运行,也不是以有权运行该脚本的用户身份运行(或者,最常见的情况,不允许执行该脚本执行的操作),所以事情不劳而获。
你以root身份运行,所以无论你尝试什么总是有效的(这有点可怕,所以要小心)。
更改脚本的权限以适应 xinetd 将守护进程用户设置为的任何内容,并确保脚本执行的任何操作都是允许守护进程用户执行的操作。但是,无论您做什么,不要设置一个守护进程以 root 身份运行——这只是等待发生的意外(或崩溃)。
编辑
RHEL 6.x 几乎可以保证阻止以 root 身份运行的守护进程执行几乎任何事情。
尝试关闭 SELinux,看看是否会改变结果(执行setenforce 0
,然后运行您的测试,然后执行 setenforce 1
以重新打开它)。
将用户设置为不同的用户(如果需要,请为此创建一个系统用户:useradd -r [blahblah]
)。
检查基于角色的权限如何工作 (http://www.ibm.com/developerworks/library/l-rbac-selinux/)。
在 unix.se 或 serverfault.se 或 RHEL/SL/CentOS IRC 频道或论坛之类的地方寻找与此问题相关的主题 - 几乎可以肯定,您不是唯一遇到此问题的人。
无论你做什么don't disable SELinux because of this! 说真的,don't。作为开发人员或系统操作员或开发人员,您应该learn how it works - 这是一个非常重要的工具。 Don't stoop to the pixels-first mindset.
【讨论】:
对不起,我不明白“守护进程既不是以 root 身份运行,也不是以有权运行该脚本的用户身份运行”。因为我已将用户设置为 root。 @ruanhao 那么你可能有不同类型的权限问题——或者某个地方的简单错字。你用的是什么发行版?大多数发行版都有一个安全权限系统(如 AppArmor 或 SELinux 或其他类似的东西),这将阻止以 root 身份运行的守护进程在默认情况下能够做很多事情——特别是因为以 root 身份运行守护进程不好 . 我使用的是“Red Hat Enterprise Linux Server 6.1 版”。我在脚本中添加了ps -p $$
,它显示当前进程的用户是root。
@ruanhao 更新了我的答案。对此没有简单的一次性答案,因为我不了解您的系统或您试图实现的整体效果的所有信息。我确实知道以 root 身份运行守护进程被普遍认为是一件坏事,并且几乎每个系统的安全默认值都设置为防止 root 守护进程能够做很多事情(你的情况的这方面 - 运行作为根的守护进程——已经是你的 XY 问题的“Y”元素)。
是的,你的观点是正确的。感谢您的建议和耐心等待!以上是关于为啥我必须 sudo 来自守护进程的命令?的主要内容,如果未能解决你的问题,请参考以下文章
来自守护进程的错误响应:冲突:无法删除版本库引用 "portainerportainer:lastest"(必须强制)。
Mac OS X sudo docker 无法连接到 Docker 守护程序。 docker 守护进程是不是在此主机上运行?
来自守护进程的错误响应:解析 Dockerfile 失败:语法错误 - 在“RUN”中找不到 =。必须采用以下形式:name=value