【问题标题】:Run a subshell as root以root身份运行子shell
【发布时间】:2020-01-31 19:43:58
【问题描述】:

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

sample-command <string>

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

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

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

注意。sudo sh -c "&lt;command&gt;" 无济于事,因为子 shell 不会继承 root/sudo 权限。例如,

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

给你sarah,而不是root

【问题讨论】:

  • 也许尝试sudo bash -pc command 以特权模式启动 bash?还有$(sudo sed ...) 有什么问题

标签: bash security subshell privilege-elevation


【解决方案1】:

Expansionscommand 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 之前会被 subshel​​l 扩展。

【讨论】:

  • 这种情况下可以在sh -c旁边的命令中使用单引号吗?例如,如果你想在 sudo sh -c 'sample-commnd arg1 arg2 ...' 的 arg1 中使用单引号,你会怎么做?
  • 你必须避开它们,比如sudo sh -c 'command '\''arg1'\' ...'。可能最好只创建一个 shellscript,将其保存到文件中,然后运行sudo bash file.sh。在该 shellscript 中,由于您以 root 身份运行它,因此您只需访问 secrets.txt,无需其他技巧
  • 关于 hek2mgl 上述评论的旁注:要了解 '\'' 的内容,请访问 unix.stackexchange.com/questions/30903/… 并查看 kenorb 的答案。
  • @Culip 你考虑引用很好,而不是因为它在这里很痛苦而忽略它!因此,这样做将为您省去 shellscripting 的许多麻烦
猜你喜欢
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多