У меня есть bash-скрипт, который использует команды sudo, но в середине мне нужно остановить sudo-влияние, а затем восстановить его.
Очень простая версия с использованием псевдокода [ ! d10] 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 предлагает для этого вариант -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
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
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
Или переключиться на фактического пользователя для этих команд: [!d2 ]
if [ -n "$SUDO_USER" ]
then
sudo -iu "$SUDO_USER" sh -c 'mkdir ~/mystuff'
fi
Возможно, вам понадобится sh -c, потому что ~ расширяется оболочкой, запускающей скрипт, и в зависимости от настроек sudo эта оболочка может считать, что домашний каталог является корневым.
Учитывая ваш текущий скрипт, нет, команда 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 эта оболочка может считать домашний каталог root.
Учитывая ваш текущий скрипт, нет, команда 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 эта оболочка может считать, что домашний каталог является корневым.