Як ввести пароль лише один раз у bash-скрипті, який потребує sudo


21

Дані

  • Я хочу, щоб користувачі операторів на цій машині змогли влаштувати власні акції cifs
  • У sudoersфайлі вже є /bin/mount -t cifs //*/* /media/* -o username=*команда для всіх операторів
  • Я хочу, щоб користувачі змогли зібрати cifsсценарій лише один раз, а не двічі.
  • Пароль sudo та пароль cifs однакові.

Що я вже маю

Цей сценарій працює:

#!/bin/bash
sudo 'mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'

... але він вимагає від користувачів вводити один і той же пароль двічі!

  • Раз для sudo
  • Раз для самого кріплення

Це також працює:

#!/bin/bash
echo -n Password: 
read -s szPassword
echo $szPassword | sudo -S sh -c 'echo $szPassword | mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'

... але для цього потрібно, щоб дозволити всім користувачам оператора можливістьsudo sh (основна проблема безпеки)

Питання

Як встановити частку cifs у bash ¹, не ставлячи shу sudoersфайл і не створюючи постійний / тимчасовий файл ???

Примітка 1: немає пітона, perl, C, Go, ... будь ласка?
Примітка 2: Я знаю, що я можу просто видалити пароль через sudoersфайл, але я намагаюся посилити безпеку, а не послаблювати її, не відмовляючись від зручності ...


2
Як щодо printf "%s\n" "$szPassword" "$szPassword" | sudo -S mount -t cifs / ...?
муру

Спробуй це зараз! @Muru
Fabby

Відповіді:


24

Натомість слід змусити користувача робити дзвінок із використання sudo як sudo script. просто перевірте, чи виконується сценарій як root, якщо не запитувати його

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root, use sudo "$0" instead" 1>&2
   exit 1
fi

Не намагайтеся захопити пароль своїх користувачів.


1
Можливо, мені щось не вистачає, але чи можете ви пояснити, як це зменшує кількість запитів паролів з двох до одного? Інакше я не бачу, як це відповідає на питання.
Оліфант - відновити Моніку

@Oliphaunt Я не бачу двох підказок пароля, ви можете це пояснити? Також ця відповідь - це не те, чого хоче ОП, а те, що їй потрібно. Чисте і правильне рішення, коли вам потрібно запустити команди як root та як це роблять інші утиліти (перевірити, чи є root, інакше
виправдайте

1
Проблема ОП (наскільки я розумію) полягає в тому, що користувачеві буде запропоновано ввести свій пароль, sudoа потім (після успішної автентифікації) знову mount. У їхньому випадку використання ці паролі однакові, тому я можу зрозуміти, чому ОП хотів би, щоб користувач мав ввести цей пароль лише один раз. Я не вірю, що ваше рішення допомагає в цьому. Я згоден, що паролі не слід захоплювати.
Оліфант - відновити Моніку

Дякую, але я, можливо, трохи спростив запитання: це вже сценарій, він вже містить тест (крім 1>&2), знаходиться в автозапуску і раніше він був лише однією часткою CIF, але зараз це три, так що справді один пароль потрібен. (Він вже містить цей тест у випадку, якщо хтось інший, який не є членом групи операторів, намагається його запустити)
Fabby

@Fabby Я все ще думаю, що ви ставитесь до проблеми неправильно. У цих випадках є помічники безпечно "запам'ятати" пароль спільної CIFS / SMB (редагування~/.smbcredentials ) та навіть без необхідності sudo (якщо ви використовуєте gvfs, umount або polkit).
Брайам

7

Я німий!

Наступний сценарій:

#!/bin/bash
read -p "Password: " -s szPassword
printf "%s\n" "$szPassword" | sudo --stdin mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER,password="$szPassword"

просто працює і:

  1. Не створює файлів, що містять паролі
  2. Дозволяє користувачеві вводити лише один пароль для кількох спільних ресурсів (включаючи Windows)
  3. Не потрібно надавати додаткові пільги. :-)

1
1 питання: чи відповідає це команда в списку процесів?
Rinzwind

3
@Rinzwind як вбудований, він не повинен базувати чи zsh. Однак команда mount могла.
муру

<<<також можна використовувати замість цього printf , але кращим підходом було б readвзагалі відмовитися і просто використовувати sudo --stdinвсе само собою. Що - щось на зразок $ printf "Type out your password\n" && sudo --stdin apt-get update користувача все ще може ввести пароль SUDO. і це не внесе його до списку процесів. Але, звичайно, існує безліч можливих інших проблем безпеки, як-от кейлоггери, потенційні вразливості в sudo, і бла, і бла, і в нескінченність
Сергій Колодяжний,

@SergiyKolodyazhnyy: Не соромтеся редагувати , людина!
Fabby

3

Не потрібно sudoпароля для виконання цієї команди; запит пароля на mountзалишки.

В sudoers, включають в себе що - щось на зразок

ALL        ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*

Включивши це, sudoбільше не буде запитувати пароль для цієї конкретної команди; користувачеві ще потрібно вказати пароль на mountкоманду.

Примітка : я взяв команду дослівно з того, що ви включили у запитання; Я не перевіряв, чи дозволять його підстановки використовувати для користувачів щось неприємне. Прочитайте на сторінці сторінки sudoersприклади неприємностей. Зокрема, зауважте, що цей рядок sudoersдозволяє користувачеві додавати будь-яку кількість -oкомутаторів чи інші аргументи mount. Ви можете переосмислити свій підхід, наприклад, додавши такий скрипт, як @Braiam пропонує і дозволити запустити це sudoбез додаткової автентифікації. Потім сценарій гарантує, що користувачі можуть запускати лише ту форму, mountяку ви бажаєте.

Крім того, замість того, щоб дозволити це для всіх користувачів, ви також можете обмежити це членами певної групи, наприклад, ви можете створити групу, cifsmountа потім мати

%cifsmount ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*

@Fabby Вибачте, але що так небезпечного в цьому? Також я можу виявити натяк на сарказм, не впевнений.
Оліфант - відновити Моніку

добре, навіть якщо sudo не вимагає пароля, mount все ще може вимагати пароля. Файл / etc / sudoers можна використовувати лише для того, щоб зробити sudo не вимагати пароля. Це не вплине на те, чи монтує програмне забезпечення пароль. Якщо людина не змогла встановити, то sudo просто в кінцевому підсумку виконає команду, яка виходить з ладу, що, швидше за все, не буде проблемою.
TOOGAM

@TOOGAM Це був мій намір. Один пароль замість двох.
Оліфант - відновити Моніку

Мій намір полягає в тому, щоб зберегти одну групу "оператора" у файлі sudoers, тому якщо оператор намагається встановити свій власний матеріал, вони все одно повинні ввести пароль, але щоб змонтувати "стандартні" кріплення оператора, вони повинні лише ввести пароль один раз замість 5 разів ... Але ваше рішення може працювати для інших, тому наголошене ... (і оригінальні коментарі видалено)
Fabby

1

Загальним рішенням цих питань є розміщення наступної преамбули у верхній частині вашого судо, що вимагає сценаріїв:

#!/bin/bash
case $EUID in
   0) : cool we are already root - fall through ;;
   *) # not root, become root for the rest of this session
      # (and ask for the sudo password only once)
      sudo $0 "$@" ;;
esac
# now the present process is effective-UID  (root)
# so there's no need to put sudo in front of commands

any more commands here will run as superuser ...

Очевидно, що це має і мінус, що якщо деякі команди в скрипті не потребують sudoвиконання, тут непотрібне підвищення привілеїв.

У всякому разі, думав, що поділюся цією маленькою порадою. Найприємніше в цьому, це те, що якщо ви вже є ефективно-uid root (наприклад, якщо ви вже називали його під sudo), він витончено робить все правильно. Також помилка та примушення до повторного введення / повторного використання (із судо) менш дружні.

Ви також можете перевірити timestamp_timeoutзмінну, в man 5 sudoersякій повідомляється sudoзапам'ятати облікові дані користувачів протягом обмеженої кількості хвилин (і може бути дробовою).


Я спростив сценарій, щоб отримати просту відповідь: сценарій вже містить: #test if root: if not: bail out if [[ $EUID -ne 0 ]]; then echo "This script must be run as root, use sudo "$0" instead" 1>&2 exit 1 fi Справа в тому, що він також містить декілька кріплень, всі з одним і тим же паролем (знову: видалено), але все одно дякую ...
Fabby

1
Річ у тім, що рішення, яке було зазначено вище, вимагало б лише одного введення пароля (для sudo). Це не повинно вимагати жодного іншого. Плюс це загальне (і більш елегантне, ніж помилка та повторне введення команди з sudo) для всіх подібних питань, навіть коли вони вимагають декількох (більше двох) привілейованих команд.
аріельф

Це повинно , але це НЕ ! ;-) Це тому, що для кожного монтажу CIF також потрібен пароль. (як це може відрізнятися від пароля Ubuntu, але в цьому випадку це не так, як оператори синхронізують свої паролі для Windows та Ubuntu)
Fabby
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.