首页 > 解决方案 > 以root身份运行子shell

问题描述

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

sample-command <string>

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

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

这可以由非 root、sudoer 用户完成吗?

笔记。 sudo sh -c "<command>"没有帮助,因为子外壳不会继承 root/sudo 特权。例如,

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

给你sarah,不是root

标签: bashsecuritysubshellprivilege-elevation

解决方案


在执行实际命令行之前,shell 将处理诸如命令替换之类的扩展:

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

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

sudo sh -c "echo foouser"

扩展不会发生在单引号内:

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

在此示例$(whoami)中,不会通过调用 shell 进行处理,因为它出现在单引号内。$(whoami)因此在调用 echo 之前会被 subshel​​l 扩展。


推荐阅读