使用 sudo 执行命令并使用 sudo 执行 Bash 脚本

使用 sudo 执行命令并使用 sudo 执行 Bash 脚本

我一直认为执行命令sudo和执行 bash 脚本sudo是相同的。但今天我发现他们不一样了。这是我测试过的:

me@my_machine:~$ sudo echo $(whoami)

我从终端执行命令并得到输出:me。阅读此链接后:为什么“sudo -u root echo whoami”不返回root,我明白这一点。

然后我创建一个名为的 bash 脚本test.sh

#!/usr/bin/env bash
echo $(whoami)

我执行这个脚本:sudo ./test.sh,令我惊讶的是,输出现在变成:root

那么执行命令sudo和执行 Bash 脚本sudo是不同的吗?

如果我有一个包含命令 的 Bash 脚本whoami,并使用 执行它sudo,我怎样才能得到me, 而不是root

答案1

$(whoami)这个答案解释了哪些用户执行问题中显示的命令替换。实际上,echo $(whoami)希望该构造永远不会被使用,因为whoami它本身就是输出当前用户用户名的正确方法。

echo根本不需要调用命令替换,甚至在某些情况下也可能需要调用命令替换调整命令替换中命令的输出。不要使用echo $(...).

运行whoami将输出问题中非特权用户的用户名,并sudo whoami输出root.


让 shell 运行命令

sudo echo $(whoami)

它必须首先弄清楚调用什么参数sudoecho只是一个简单的字符串,因此 shell 不会对其执行任何操作,而是$(whoami)需要扩展的命令替换。它通过执行whoami命令替换并将其替换为其输出来实现此目的。然后就可以调用了sudo

这意味着sudo将使用echo和 的输出whoami(以非特权用户身份执行)作为参数来执行。

如果你想whoami在命令替换里面运行 sudo,您可以将其放入脚本中并使用 运行脚本sudo,就像您所做的那样,或者您可以使用内联脚本,如

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

此处,sh -c脚本以 root 身份运行,因此whoami也将以 root 身份运行。

重点是运行的外壳whoami以 root 用户身份执行。

whoami第一个命令 中执行的 shellsudo echo $(whoami)以普通用户身份运行,而不是 root 用户。

相关内容