Я пишу сценарий (на самом деле комбинация сценариев и make-файла), который устанавливает внешние зависимости: некоторые apt-get
команды, некоторые git
клонирование, сборка, установка, добавление пользователей в группы, ...
Некоторые операции в этих сценариях требуют прав суперпользователя, а некоторые - нет.
До сих пор я запускал весь процесс make с помощью sudo, но у него есть некоторые недостатки:
git
РЕПО клонировать получить вroot
качестве владельца, а это значит , что я не могу изменить их впоследствии безsudo
илиchown
- скрипты, которые добавляют пользователей в группы, не знают, какого пользователя добавить, так как
whoami
возвращаетсяroot
Каков наилучший способ запуска в качестве суперпользователя только тех команд, которые этого требуют? В идеале процесс все равно потребует от меня ввода sudo
пароля, но только один раз в самом начале процесса установки. Затем он забудет об этом в самом конце, но сохранит все время до тех пор (это может занять несколько часов).
Решения, которые я нашел в Интернете, включают в себя:
sudo -v
в начале сценария, но если я правильно понимаю, это время ожидания. Мой сценарий может быть запущен в течение нескольких часов- запуск скрипта с помощью
sudo
, но команды, которым не нужен суперпользователь сsudo -u $(logname) <command>
. Это то, что я делаю сейчас, но кажется, что все должно быть наоборот.
В идеале я хотел бы, чтобы мой сценарий:
- запросить учетные данные суперпользователя
- запускать обычные команды как зарегистрированный пользователь
- Запустите команды sudo с учетными данными, введенными на шаге 1
sudo -k
закрыть сеанс суперпользователя
SUDO_USER
переменную окружения. Если он присутствует, он будет содержать имя пользователя, вызывающего sudo. Таким образом, вы можете (как пользователь root) chown $ SUDO_USER: $ SUDO_GID $ your_files. Точно так же вы можете проверить эти переменные, чтобы ваши команды adduser знали, какого пользователя добавить.su $SUDO_USER -c command
команды для запуска от имени обычного пользователя.Ответы:
Поскольку у вас есть доступ к sudo, создайте файл sudoers для себя, а затем удалите его, когда скрипт будет выполнен:
источник
Один из способов, что я не буду вообще рекомендую, чтобы прочитать пароль самостоятельно, а также использование
sudo
«s-S
возможность передать пароль , как и в случае необходимости:От
man sudo
:источник
echo "$password"
??echo "$password"
не будет, но heredocs и herestrings немного более безопасны. Они не видны в командной строке, показанной обычными инструментами.echo "$password"
на левой стороне трубы является безопасным в Баш скрипт.echo
встроенная оболочка;/bin/echo
не работает, когда это называется простоecho ...
. У некоторых других оболочек естьecho
встроенные (dash
например), но оболочки типа Bourne не обязательно иметь такую . Поэтому я думаю, чтоecho "$password" |
это приемлемо в bash, но лучше избегать его, если кто-то переносит скрипт в другую оболочку, не замечая проблемы. Я использую непереносимый,[[
а не[
в этом сценарии, чтобы предотвратить такую же проблему. @KasiyA