运行 作为 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 展开
假设您有一台 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.