运行 作为 root 的子 shell

Run a subshell as root

假设您有一台 Linux/UNIX 机器 Bash。您有一个文件 secret.txt 只有 root 可以读取。您想使用一个以字符串作为参数的命令,例如,

sample-command <string>

以根用户身份登录并运行使用文本文件第一行的命令:

root ~ $ sample-command $(sed '1!d' secret.txt)

非 root、sudoer 用户可以做到这一点吗?

注意。 sudo sh -c "<command>" 没有帮助,因为子 shell 不继承 root/sudo 特权。例如,

sarah ~ $ sudo sh -c "echo $(whoami)"

给你 sarah,而不是 root

Expansions like command substitution 将在执行实际命令行之前由 shell 处理:

sudo sh -c "echo $(whoami)"
foouser

这里shell会先运行 whoami,作为当前用户,用它的结果替换展开然后执行

sudo sh -c "echo foouser"

单引号内不展开:

sudo sh -c 'echo "$(whoami)"'
root

在此示例中,$(whoami) 不会通过调用 shell 进行处理,因为它出现在单引号内。 $(whoami) 因此在调用 echo.

之前会被 subshell 展开