【问题标题】:Why sudo -H needs an extra command?为什么 sudo -H 需要一个额外的命令?
【发布时间】:2018-04-09 12:36:17
【问题描述】:

我发现了这个相关的问题What does sudo -H do? 演示了 -H 与

的用法

sudo -H bash -c 'echo $HOME $USER'

但我不明白为什么bash是必要的,因为echo命令可以独立运行,但运行

sudo -H echo $HOME $USER

将显示当前用户变量(而不是 root 的)。

那么为什么(在这种情况下)命令需要 bash 作为 sudo 参数运行以接受 -H 标志?

如果指定另一个用户也是如此,例如sudo -H -u anotheruser echo $HOME $USER

【问题讨论】:

  • echo放在sudo -H echo $HOME $USER 前面你就明白了。那里不需要bash,这是一种通过sudo 启动的命令而不是当前shell 来评估$HOME 的方法。
  • 那么什么样的命令来做这个评估呢?显然echo 不行,是不是必须是能够创建交互式shell 的命令?

标签: bash sudo


【解决方案1】:

当你运行命令时:

sudo -H echo $HOME $USER 

变量$HOME$USER 由当前shell 计算。它们被替换为它们的值,并且以这种方式调整的命令行被传递给sudo

F.e.如果你的用户名是foo,你的家是/home/foo,那么上面的命令就是:

sudo -H echo /home/foo foo

获得您想要的东西不一定需要bash。需要一种通过sudo 执行的命令而不是当前shell 来评估环境变量的方法。

当你运行时:

 sudo -H bash -c 'echo $HOME $USER'

$HOME$USER 环境变量不会由当前 shell 评估,因为它们用单引号括起来。

sudo 接收这里写的命令行(它的第四个参数是字符串echo $HOME $USER 作为一个单词)。然后它使用两个参数启动bash-c 和上面提到的字符串。

bash-c 解释为作为下一个参数提供的“执行命令”。然后它会尝试运行echo $HOME $USER(注意这里的变量没有用引号括起来),并且在运行echo 之前,它会用它们的值(现在属于新用户)替换$HOME$USER

需要运行bash(或任何其他shell)来在新用户的执行环境中进行变量扩展。

【讨论】:

    【解决方案2】:

    $HOME$USERsudo 甚至运行之前由 shell 扩展。您需要bash -c 来添加一个间接层,以便shell run by sudo 进行扩展。

    【讨论】:

      猜你喜欢
      • 2014-01-08
      • 1970-01-01
      • 2023-04-04
      • 2014-01-28
      • 2015-08-24
      • 2020-02-25
      • 2017-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多