为啥我必须 sudo 来自守护进程的命令?

Posted

技术标签:

【中文标题】为啥我必须 sudo 来自守护进程的命令?【英文标题】:Why I have to sudo a command from daemon process?为什么我必须 sudo 来自守护进程的命令? 【发布时间】:2015-05-23 09:33:04 【问题描述】:

我对@9​​87654322@ 有疑问。

我从一个守护进程调用一个 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

为啥 Celery 守护进程看不到任务?

如何使用 Django 运行自己的守护进程?

直接使用docker而无须加sudo