Как создать сценарий, который запускает yum от имени пользователя root, но остальную часть сценария выполняет как вызывающий пользователь

Определите отображение в vi, которое вставляет ваш текст из буфера обмена, удаляет все EOL и возвращает его в системный буфер обмена. Таким образом, можно выполнить весь шаг 2 с помощью одного отображения, ведущего к двум, скажем, двум нажатиям клавиш.

2
02.06.2017, 16:00
2 ответа

Если использование sudo вообще считается хорошей практикой, и если его использование, особенно в коротком сценарии, предназначенном для выполнения вручную, упрощает логику или обслуживание и достигает желаемой цели, тогда я бы сказал, что использование sudo в сценарии уместно, если не предпочтительно.

Внутри скрипта можно использовать sudo и запускать скрипт от имени обычного пользователя. Вызванный sudo обычно запрашивает пароль только один раз (или вообще не запрашивает, если пользователь недавно использовал sudo). Однако для правильного поведения сценарий должен запрещать пользователю запускать его от имени пользователя root.

# This should not be run as root (or using 'sudo')
if [ "$(/usr/bin/id -u)" == "0" ] ; then
   echo "This script cannot be run as root (or using 'sudo')!" 1>&2
   exit 1
fi
# Use sudo per command here
sudo groupadd docker
sudo gpasswd -a $USER docker

Здесь, поскольку переменная $USER соответствует обычному пользователю, она будет вставлена ​​как ожидаемый аргумент для gpasswd.

Этот пример можно запустить от имени обычного пользователя; не судо. Обратите внимание, однако, что пользователь должен иметь привилегии sudo для правильного выполнения.

2
27.01.2020, 21:58

Вы можете проверить переменную SUDO_USER, чтобы определить, выполняется ли скрипт через sudo, и если да, то какой пользователь запустил его. Затем вы просто используете это в gpasswd:

gpasswd -a "${SUDO_USER}" docker

или

gpasswd -a "${SUDO_USER-$USER}" docker

, если вы хотите вернуться к USER в отсутствие SUDO_USER.

Команда, которая заставляет вас войти в систему как root (строго говоря, это не меняет ваш логин, она запускает новую оболочку)

newgrp docker

Чтобы это исправить, то есть закончите как вы с docker в качестве вашей основной группы, вам нужно запустить это как себя; предполагая, что sudo,

su "${SUDO_USER}" -c "newgrp docker"

сделает это.

Обратите внимание, что завершение вашего скрипта с newgrp таким образом означает, что ваш скрипт не завершается как таковой, когда вы получаете новое приглашение; результат:

  • оболочка, в которой вы находитесь при вводе sudo ./myscript.sh
    • sudo
      • запущенная оболочка myscript.sh
        • newgrp
          • запущенная оболочка с docker в качестве основной группы

Сценарий завершится только при выходе из оболочки, запущенной newgrp.

2
27.01.2020, 21:58

Теги

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