当我 sudo bash -c 时会发生什么?

tt_*_*ntz -2 linux bash shell terminal sudo

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

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

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

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

ani*_*ane 5

考虑这个片段(注意 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
Run Code Online (Sandbox Code Playgroud)
  1. 在第一种情况下,以用户身份sudo启动。ps -froot
  2. 在第二种情况下,sudo以带有参数的用户bash身份开始。看来,作为一种优化,正在使用start 。因此,只能看到 2 个进程。root-c 'ps -f'bashexecps -f
  3. 在第 3 种情况下,sudo以带参数的用户bash身份开始。命令(对 的参数)不是简单的可执行文件 + args。它们是 2 个命令,以. 所以,不能直接调用。它使用标准机制。所以,是进程的父进程。root-c 'echo hi; ps -f'-c;bashexecfork+execbashps