我有一个使用 sudo 命令的 bash 脚本,但中间我需要停止 sudo-influence,然后稍后恢复它。
使用伪代码的非常简单的版本
sudo apt-get install -y synaptic
sudo ...
// I need to suspend sudo here, otherwise the folder
// is created with root as the owner.
mkdir ~/mystuff
// then reinstate it here
sudo apt-get install -y ssllib
sudo 在开始运行 bash 脚本时是否会立即请求密码 - 或者 - 仅在遇到第一个“sudo”行时才询问?
如果是这样,那么我想我可以把所有非 sudo 的东西移到顶部。但是,问题是我必须等到遇到第一个“sudo”行才能输入密码。
答案1
sudo
提供了这个选项-u
,请参见man sudo
:
-u user, --user=user
Run the command as a user other than the default target user (usually root).
The user may be either a user name or a numeric user ID(UID) prefixed
with the ‘#’ character (e.g. #0 for UID 0). When running commands as a UID,
many shells require that the ‘#’ beescaped with a backslash (‘\’).
Some security policies may restrict UIDs to those listed in the password
database. The sudoers policyallows UIDs that are not in the password database
as long as the targetpw option is not set. Other security policies may
not support this.
对于你的例子来说,这将是:
sudo -u USERNAME mkdir /home/USERNAME/mystuff
答案2
鉴于您当前的脚本,不,该mkdir
命令将不会运行sudo
。sudo
不会神奇地开始影响它未启动的命令。它也不会在运行之前神奇地要求输入密码。
可能发生的情况是,您可能使用 运行了整个脚本sudo
。如果是这种情况,那么您可以检查是否属实,并要求用户在不使用 的情况下运行它sudo
:
if [ -n "$SUDO_COMMAND" ]
then
echo "Please don't run this script with sudo."
exit
fi
或者,切换到实际用户执行以下命令:
if [ -n "$SUDO_USER" ]
then
sudo -iu "$SUDO_USER" sh -c 'mkdir ~/mystuff'
fi
您可能需要sh -c
因为~
由运行脚本的 shell 扩展,并且根据sudo
设置,该 shell 可能认为主目录是 root 的。