为什么sudo -H需要一个额外的命令?

时间:2018-04-09 12:36:18

标签: bash sudo

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

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

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

sudo -H echo $HOME $USER

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

那么为什么(在这种情况下)bash所需的bash作为sudo参数运行以获取-H标志?

如果指定其他用户,例如sudo -H -u anotheruser echo $HOME $USER

,也是如此

2 个答案:

答案 0 :(得分:1)

$HOME甚至运行之前,

$USERsudo由shell进行扩展。您需要bash -c添加一个间接层,以便 sudo运行的shell进行扩展。

答案 1 :(得分: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'

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

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

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

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