Попросити пароль для sudo та програмно підвищити привілей у bash script?


49

Зараз я працюю над сценарієм bash, який встановлює та налаштовує різні програми на фондовій системі Linux (зараз Ubuntu). Оскільки він встановлює програми та копіює ряд файлів у різні папки, які потребують підвищених привілеїв, я вже зробив стандарт "Мені потрібні підвищені привілеї" -і-вихід.

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

Оскільки це розроблено для роботи на інсталяціях Linux, будь-яка опція, що модифікує систему, не працює для моїх цілей. Усі параметри повинні міститись до самого сценарію.

Чи можливо це в межах Bash? Якщо так, то який найкращий (безпечний, але стислий) спосіб зробити це?



@MichaelMrozek - Ах, радості мати стільки нішевих сайтів, намагаючись мінімізувати фрагментацію. І знаєте, посилання, яке ви давали, жодного разу не підходило для мене під час пошуку в Google.
Шауна


@jww ви розумієте, що майже всі ці посилання запитували приблизно через 4 роки після цього, правда?
Шауна

1
@Shauna - Я здогадуюсь, ти вже вирішив проблему. Посилання призначені для майбутніх відвідувачів.

Відповіді:



16

Я пропоную:

#!/bin/bash

if (($EUID != 0)); then
  if [[ -t 1 ]]; then
    sudo "$0" "$@"
  else
    exec 1>output_file
    gksu "$0 $@"
  fi
  exit
fi

# some example stuff
ls -l /root
echo "app: $0"
for f; do
  echo ">$f<"
done

Для чого if [[ -t 1 ]];перевіряється?
Шауна

Ну, тоді добре. Я подумав, що це має щось спільне з терміналом проти GUI, але не був впевнений, що перевіряє оператор if.
Шауна

Дивовижно, дякую!
Fire-Dragon-DoL

16

Додайте це як перший рядок сценарію:

[ "$UID" -eq 0 ] || exec sudo bash "$0" "$@"

Перейдіть sudoна gksuабо, gksudoякщо вам більше зручно, графічний запит.


3
Зверніть увагу, що "$*"збирається об'єднати всі аргументи в один ( /path/to/script one two threeце призведе до $1існування one two three), і $*без лапок буде зіпсувати пробіли в аргументах. "$@"працює правильно
Михайло Мрозек

@MichaelMrozek Ага, правильно. Це те, що я шукав, виправлено
Кевін

Чи є спосіб зробити це на Debian, де, здається, немає команди sudo?
неправильнекористування

@wrongusername встановити sudo, це набагато краще, ніж використовувати su. Але якщо ти дуже хочеш, напевноexec su -c "$0" "$@"
Кевін

2

Приклад сценарію, я не поділяюся розумом ::

#!/bin/bash
[ "$UID" -eq 0 ] || exec sudo "$0" "$@" && echo -n "sudo bash what: "
read WHAT
sudo $WHAT

--ImP.TeK


[ "$UID" -eq 0 ] || exec sudo "$0" "$@"- Виглядає як справді ефективний один лайнер! Приємно!
groovenectar

Чи має сенс тут використовувати ефективний UID $EUDIабо завжди однаковий результат? Наприклад,[[ "$EUID" -eq 0 ]] || exec sudo "$0" "$@"
groovenectar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.