На этот вопрос уже есть ответ здесь:
У меня есть сценарий bash, который использует команды sudo, но в середине мне нужно остановить sudo-impact, а затем восстановить его.
Очень простая версия с использованием псевдокода
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», чтобы затем ввести кодовую фразу.
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
Учитывая Ваш текущий сценарий, нет, эти 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
, потому что ~
расширен оболочкой, запускающей скрипт, и в зависимости от sudo
настройки, та оболочка могла бы думать, что корневой каталог является корнем.