【问题标题】:What happens when I sudo bash -c? [closed]当我 sudo bash -c 时会发生什么? [关闭]
【发布时间】:2016-06-16 06:25:14
【问题描述】:

我知道sudo bash -c 'some_command' 将以与 sudo 相同的权限运行 some_command

我对发生了什么感到困惑?它是否在 bash 中以 sudo 运行 some_command(与 sudo bash 相同)然后切换回我当前的用户?为什么我没有像运行 sudo bash 时那样留在具有 sudo 权限的 bash 实例中?

我尝试运行man bash,它描述了-c 选项(引用如下)。 但是,我正在努力解释描述与我在运行sudo bash -c 'some_command' 时观察到的行为之间的关系。

如果存在 -c 选项,则从第一个非选项参数 command_string 中读取命令。如果之后有争论 command_string,它们被分配给位置参数,从 $0 开始。

【问题讨论】:

    标签: linux bash shell terminal sudo


    【解决方案1】:

    考虑一下这个 sn-p(注意 UID 和 PID/PPID 列。):

    $ sudo ps -f
    UID        PID  PPID  C STIME TTY          TIME CMD
    root      8997  8715  0 11:57 pts/17   00:00:00 sudo ps -f
    root      8998  8997  0 11:57 pts/17   00:00:00 ps -f
    
    $ sudo bash -c 'ps -f'
    UID        PID  PPID  C STIME TTY          TIME CMD
    root      8909  8715  3 11:55 pts/17   00:00:00 sudo bash -c ps -f
    root      8910  8909  0 11:55 pts/17   00:00:00 ps -f
    
    $ sudo bash -c 'echo hi; ps -f'
    hi
    UID        PID  PPID  C STIME TTY          TIME CMD
    root      8957  8715  0 11:56 pts/17   00:00:00 sudo bash -c echo hi; ps -f
    root      8958  8957  0 11:56 pts/17   00:00:00 bash -c echo hi; ps -f
    root      8959  8958  0 11:56 pts/17   00:00:00 ps -f
    
    1. 在第一种情况下,sudoroot 用户身份启动 ps -f
    2. 在第二种情况下,sudoroot 用户的参数 -c 'ps -f' 开始 bash。看来,作为一种优化,bash 正在使用exec 启动ps -f。因此,只能看到 2 个进程。
    3. 在第三种情况下,sudoroot 用户的参数 -c 'echo hi; ps -f' 开始 bash。该命令(-c 的参数)不是简单的可执行文件 + args。它们是由 ; 分隔的 2 个命令。所以,bash 不能直接调用exec。它使用标准的fork+exec 机制。所以,bashps 进程的父进程。

    【讨论】:

    【解决方案2】:

    sudo 切换用户,然后执行bash,将其他参数传递给它。 bash以新用户身份运行,在-c之后运行参数中的命令。

    【讨论】:

    • 在执行-c 之后的命令后是否会自动退出bash?行为与运行sudo bash 并在bash 之后指定命令有何不同
    • 因为 bash 就是这样工作的。如果你不指定命令,那么它会打开一个 REPL。
    • 介意我修改您的答案以将其添加到其中吗?最后一部分几乎回答了我的问题
    猜你喜欢
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 2021-05-03
    相关资源
    最近更新 更多