Я пишу сценарий (на самом деле комбинация сценариев и make-файла), который устанавливает внешние зависимости: некоторые apt-get
команды, некоторые git
клонирование, создавая, устанавливая, добавляя пользователей к группам...
Некоторые операции в этих сценариях требуют полномочий суперпользователя, некоторые не делают.
До сих пор я работал, все делают процесс с sudo, но он имеет некоторые недостатки:
git
repos, которые я клонирую, добираются root
как владелец, что означает, что я не могу изменить их впоследствии без sudo
или chown
whoami
возвраты root
Каков лучший способ работать как суперпользователь только команды, которые требуют его? Идеально процесс все еще потребовал бы, чтобы я ввел мой sudo
пароль, но только однажды в самом начале процесса установки. Это затем забыло бы это в самом конце, но сохранило бы все это временем до тех пор (может потребоваться несколько часов).
Решения, которые я нашел онлайн, включают:
sudo -v
в begninning сценария, но если я понимаю правильно, это испытывает таймаут. Мой сценарий мог работать в течение нескольких часовsudo
, но команды, для которых не нужен суперпользователь с sudo -u $(logname) <command>
. Это - то, что я делаю теперь, но такое чувство, что это должно быть наоборот.Идеально, я хотел бы свой сценарий к:
sudo -k
закрыть сеанс суперпользователяТак как Вы имеете sudo доступ, создаете sudoers файл для себя, затем удаляете его, когда сценарий сделан:
# grant this user access to the sudo commands without passwords
# add all required cmds to the CMDS alias
sudo tee /etc/sudoers.d/$USER <<END
$USER $(hostname) = NOPASSWD: /usr/bin/apt-get, /usr/sbin/adduser, /bin/rm, ...
END
# your script goes here
sudo apt-get install ...
git clone ...
sudo adduser group2 $USER
sudo adduser group1 $USER
: ...
# then, remove the sudo access
sudo /bin/rm /etc/sudoers.d/$USER
sudo -k
Один путь, который я обычно не рекомендовал бы, состоит в том, чтобы читать в пароле самостоятельно и использовании sudo
-S
опция передать пароль как и, когда необходимый:
#! /bin/bash
IFS= read -rsp 'Enter your password: ' password
git clone ...
sudo -S apt-get install foo -y <<<"$password"
От man sudo
:
-S, --stdin
Write the prompt to the standard error and read the password
from the standard input instead of using the terminal device.
The password must be followed by a newline character.