Выполненный только части сценария как sudo, вводя пароль только однажды

Я пишу сценарий (на самом деле комбинация сценариев и make-файла), который устанавливает внешние зависимости: некоторые apt-get команды, некоторые git клонирование, создавая, устанавливая, добавляя пользователей к группам...

Некоторые операции в этих сценариях требуют полномочий суперпользователя, некоторые не делают.

До сих пор я работал, все делают процесс с sudo, но он имеет некоторые недостатки:

  • git repos, которые я клонирую, добираются root как владелец, что означает, что я не могу изменить их впоследствии без sudo или chown
  • сценарии, которые добавляют пользователей к группам, не знают который пользователь добавить с тех пор whoami возвраты root

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

Решения, которые я нашел онлайн, включают:

  • sudo -v в begninning сценария, но если я понимаю правильно, это испытывает таймаут. Мой сценарий мог работать в течение нескольких часов
  • запущение скрипта с sudo, но команды, для которых не нужен суперпользователь с sudo -u $(logname) <command>. Это - то, что я делаю теперь, но такое чувство, что это должно быть наоборот.

Идеально, я хотел бы свой сценарий к:

  1. попросите учетные данные суперпользователя
  2. выполните нормальные команды как зарегистрированного пользователя
  3. выполненный sudo управляет с учетными данными, вводимыми в шаг 1
  4. sudo -k закрыть сеанс суперпользователя
14
задан 13 February 2015 в 03:34

2 ответа

Так как Вы имеете 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
7
ответ дан 23 November 2019 в 03:06

Один путь, который я обычно не рекомендовал бы, состоит в том, чтобы читать в пароле самостоятельно и использовании 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.
2
ответ дан 23 November 2019 в 03:06

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

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