У меня есть длинный и продолжительный сценарий удара, куда горстка команд должна быть выполнена как корень, в то время как большинство команд должно быть выполнено как обычный пользователь прежде sudo, потому что оно испортило бы принадлежность файла и такой.
Я придумал некоторые методы, но у каждого из них есть некоторые проблемы
Метод 1: Используя sudo в файле
#!/bin/bash
sudo echo "I must be run by root"
touch needsToBeOwnedByUser1
echo "needs to be run by user"
sleep 1000
sudo echo "I, again, must be run by root"
Это выглядело бы хорошим от способа, которым написан код. sudo
записан перед несколькими операторами, которые на самом деле должны быть выполнены корнем, но если время между каждым sudo
вызов является слишком длинным sudo
снова просит пароль. Кроме того, если первое выполнение sudo
сбои, например, из-за неверного пароля, остальная часть сценария все еще выполняются.
Метод 2: использование sudo, чтобы назвать файл и затем возвратиться исходному пользователю при необходимости
#!/bin/bash
echo "I must be run by root"
su username -c 'touch needsToBeOwnedByUser1'
su username -c 'echo "needs to be run by user"'
su username -c 'sleep 1000'
echo "I, again, must be run by root"
Это также сосет, потому что я должен добавить su username -c
почти перед каждой строкой. Также находя исходное имя пользователя после sudo
является возможным, но громоздким.
Существует ли лучший путь?
Править: Я только отправил маленькие, бессмысленные сценарии здесь для показа то, о чем я говорю. В фактическом сценарии у меня есть некоторые строки, которым нужен sudo (стартовые и останавливающиеся сервисы), некоторые строки, где не имеет значения, если существует sudo и довольно много строк, которые действительно должны быть выполнены без sudo.
Относительно метода 2, легче использовать функцию. Например:
#!/bin/bash
func(){
echo "Username: $USER"
echo " EUID: $EUID"
}
export -f func
func
su "$SUDO_USER" -c 'func'
$SUDO_USER
имя пользователя sudoer. Вы могли также использовать $(logname)
в его месте.
Работа моей машины:
$ sudo bash test.sh
[sudo] password for wja:
Username: root
EUID: 0
Username: wja
EUID: 1000
Путем чтения man sudoers
, каждый видит:
PASSWD and NOPASSWD
By default, sudo requires that a user authenticate him or herself
before running a command. This behavior can be modified via the
NOPASSWD tag. Like a Runas_Spec, the NOPASSWD tag sets a default for
the commands that follow it in the Cmnd_Spec_List. Conversely, the
PASSWD tag can be used to reverse things. For example:
ray rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm
would allow the user ray to run /bin/kill, /bin/ls, and /usr/bin/lprm
as root on the machine rushmore without authenticating himself.
Таким образом Вы могли позволить regular
на хосте machine1
выполниться command1
и command2
как корень, без аутентификации по паролю с:
reguser machine1 root = NOPASSWD: /usr/local/command1, /usr/local/command2
но считайте каждый из man -k sudo
для деталей.
Возможно, это поможет:
chmod 775 yourscript.sh
Тогда вы можете использовать sudo внутри скрипта (без запроса пароля) И не может использовать sudo для других команд внутри вашего скрипта.