У меня есть сценарий, который может работать как sudo script.sh
или pkexec script.sh
Это было бы намного более хорошо с пользовательской точки зрения если сценарий, который попросили пароля от пользователя, просто выполнив его по имени script.sh
.
Как я могу "встроить" запрос в pkexec
или sudo
запускать целый скрипт с полномочием пользователя root?
Обратите внимание что выполнение всего с sudo sh -c
не могло бы быть лучшее решение, поскольку у меня есть функции в сценарии.
Это будет работать:
echo "$(whoami)"
[ "$UID" -eq 0 ] || exec sudo "$0" "$@"
пример:
./test.sh
blade
[sudo] password for blade:
root
ответ blade19899 является действительно способом пойти, однако можно было также звонить sudo bash
в хижину:
#!/usr/bin/sudo bash
# ...
очевидный протест, это будет работать только, пока сценарий называют с ./script
и перестанет работать, как только сценарий называют с bash script
.
Я снабжаю предисловием команды в рамках сценария, которые должны базироваться доступ с sudo
- если пользователь уже не получил разрешения, подсказки сценария для пароля в той точке.
пример
#!/bin/sh
mem=$(free | awk '/Mem:/ {print $4}')
swap=$(free | awk '/Swap:/ {print $3}')
if [ $mem -lt $swap ]; then
echo "ERROR: not enough RAM to write swap back, nothing done" >&2
exit 1
fi
sudo swapoff -a &&
sudo swapon -a
Этот скрипт может или быть запущен как sudo <scriptname>
или как <scriptname>
. В любом случае это попросит пароль, только однажды.
Кажется, что никто больше не обратился к очевидному беспокойству здесь. Помещение sudo
в рамках Вашего сценария, который Вы затем распределяете , продвигает плохие пользовательские привычки . (Я предполагаю, что Вы распределяете его, потому что Вы упоминаете "с пользовательской точки зрения".)
истина - то, что существует инструкция в использовании приложений и сценариев, который подобен принципу защиты в банковском деле: Никогда не выделяют Ваши персональные данные кому-то, кто звонит Вам и говорит, что они звонят "от Вашего банка" , и который существует по подобным причинам.
правило для приложений:
Никогда тип в Вашем пароле при запросе, если Вы не уверены , что делается с ним. Это применяется трижды к любому с sudo
доступ.
, Если Вы вводите свой пароль, потому что Вы работали sudo
на командной строке, большой. Если Вы вводите его, потому что Вы выполнили команду SSH, прекрасную. Если Вы вводите его, когда Вы входите в систему своего компьютера, большого, конечно.
, Если Вы просто запускаете внешний скрипт или исполняемый файл и послушно вводите Ваш пароль при запросе его Вы имеете никакая идея , что сценарий делает с ним. Это могло хранить его во временном файле в простом тексте для всего, что Вы знаете и даже могли бы не вымыться после себя.
, Очевидно, существуют отдельные и дополнительные опасения по поводу выполнения неизвестного набора команд как root
, но о чем я говорю, здесь поддерживает безопасность на самом пароле . Даже принятие приложения/сценария не является злонамеренным, Вы все еще хотите, чтобы Ваш пароль был обработан надежно для предотвращения другой приложения от овладения им и использования его злонамеренно.
Так, мой собственный персональный ответ на это, лучшая вещь вставить Ваш сценарий, если этому нужны полномочия пользователя root:
#!/bin/bash
[ "$UID" -eq 0 ] || { echo "This script must be run as root."; exit 1;}
# do privileged stuff, etc.
Я сделал это этот путь:
echo -n "Enter password for sudo rights: "
read -s pass
echo $pass | sudo -S [your command here]
Если Вы хотели бы симпатичное диалоговое окно, попробуйте что-то вроде этого. Я разорвал это прямо из чего-то еще, что я записал, таким образом, это имеет дополнительный материал, Вы, возможно, не нуждались бы или хотели бы, но это показывает общее представление:
brand="My Software"
# Check that the script is running as root. If not, then prompt for the sudo
# password and re-execute this script with sudo.
if [ "$(id -nu)" != "root" ]; then
sudo -k
pass=$(whiptail --backtitle "$brand Installer" --title "Authentication required" --passwordbox "Installing $brand requires administrative privilege. Please authenticate to begin the installation.\n\n[sudo] Password for user $USER:" 12 50 3>&2 2>&1 1>&3-)
exec sudo -S -p '' "$0" "$@" <<< "$pass"
exit 1
fi
Это использует whiptail, который можно установить, если у Вас уже нет его:
sudo apt-get install whiptail