据我所知,sudo -u <user>
可以在作为 sudo 运行的脚本中使用,以便“取消”继承的 sudo,因此以普通用户身份运行后面的行。只是在我看来,它并不是这样工作的,至少在下面的上下文中不是这样:它好像sudo -u <user>
什么也没做!
为了说明这一点,使用两个简单的 Bash 脚本、一个master.sh
脚本和一个slave.sh
脚本:
master.sh:
#!/bin/bash
sudo -u dad /home/dad/Downloads/slave.sh
从属.sh:
#!/bin/bash
if [[ ! -v DOTNET_ROOT ]] # If variable is not set ...
then
echo "DOTNET_ROOT needs to be set ..."
else
echo "No need to set DOTNET_ROOT."
fi
以下是运行不同场景时会发生的情况:
dad@DadsGram~/Downloads $ echo $DOTNET_ROOT
/home/dad/.dotnet
dad@DadsGram~/Downloads $ ./slave.sh
No need to set DOTNET_ROOT.
dad@DadsGram~/Downloads $ sudo ./master.sh
DOTNET_ROOT needs to be set ...
dad@DadsGram~/Downloads $ sudo ./slave.sh
DOTNET_ROOT needs to be set ...
请问我做错了什么?
答案1
第二个sudo
不是“取消”前一个sudo
,而是覆盖前一个。就像把假发戴在帽子上,而不是摘掉帽子一样。
我猜您知道这sudo
会带来删除环境变量的副作用。 (旁注:因为那不是基本的的目的sudo
,如果您能更清楚地解释您所理解的内容以及您想要实现的目标,那就太好了。)第二个sudo
会覆盖第一个完成的 UID 设置。它无法将整个环境恢复到第一次之前的状态sudo
;它无法神奇地恢复已删除的环境变量。