Лучшие практики при использовании sudo в сценарии удара

У меня есть длинный и продолжительный сценарий удара, куда горстка команд должна быть выполнена как корень, в то время как большинство команд должно быть выполнено как обычный пользователь прежде 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.

9
задан 25 July 2017 в 05:52

3 ответа

Относительно метода 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
5
ответ дан 23 November 2019 в 05:07

Путем чтения 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 для деталей.

2
ответ дан 23 November 2019 в 05:07

Возможно, это поможет:

chmod 775 yourscript.sh

Тогда вы можете использовать sudo внутри скрипта (без запроса пароля) И не может использовать sudo для других команд внутри вашего скрипта.

-1
ответ дан 11 April 2020 в 10:49

Другие вопросы по тегам:

Похожие вопросы: