Запускайте лише частини сценарію як sudo, вводячи пароль лише один раз


14

Я пишу сценарій (насправді поєднання сценаріїв і makefile), який встановлює зовнішні залежності: деякі apt-getкоманди, деякі gitклонування, створення, встановлення, додавання користувачів до груп, ...

Для деяких операцій у цих сценаріях потрібні дозволи суперпользователя, деякі - не.

До цих пір я керував усім процесом make з судо, але він має деякі недоліки:

  • gitрепост Я клонуюсь rootяк власник, це означає, що я не можу їх змінити згодом без sudoабоchown
  • сценарії, які додають користувачів до груп, не знають, кого додати з моменту whoamiповерненняroot

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

Я знайшов рішення в Інтернеті:

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

В ідеалі я хотів би, щоб мій сценарій:

  1. запитати повноваження щодо суперпользователя
  2. запускати звичайні команди як зареєстрований користувач
  3. запустити команди sudo з обліковими записами, введеними на кроці 1
  4. sudo -k закрити сесію суперпользователя

2
Ви все ще можете запустити все як sudo, а ваш сценарій може перевірити SUDO_USERзмінну середовища. Якщо він присутній, він буде містити ім’я користувача користувача, який викликає sudo. Таким чином, ви можете (як root) порушити $ SUDO_USER: $ SUDO_GID $ your_files. Аналогічно, ви можете перевірити ці змінні, щоб ваші команди аддусера знали, кого додати.
roadmr

... або запустити все як root та використовувати su $SUDO_USER -c commandдля команд, які виконуються як звичайний користувач.
Рмано

Відповіді:


7

Оскільки у вас є доступ до 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

2

Один з способів, що я не буду взагалі рекомендую, щоб прочитати пароль самостійно, а також використання sudo«s -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.

1
Це безпечно? echo "$password"??
αғsnιη

@KasiyA echo "$password"не було б, але гередоки та герестини трохи безпечніші. Їх не видно в командному рядку, показаному звичайними інструментами.
муру

1
Я думаю, строго кажучи, echo "$password"ліва сторона труби є безпечною в баш-сценарії. echo- вбудована оболонка; /bin/echoне запускається, коли його називають просто echo .... Деякі інші снаряди мають echoвбудований ( dashнаприклад), але оболонок у стилі Борна не потрібно мати. Тому я вважаю, що echo "$password" |це прийнятно в bash, але, можливо, найкраще цього уникати, якщо хтось переніме сценарій до іншої оболонки, не помічаючи проблеми. Я використовую нестерпною [[замість того , щоб [в цьому сценарії , щоб уникнути такої ж проблеми. @KasiyA
Kagan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.