Запросите полномочие пользователя root из сценария

У меня есть сценарий, который может работать как sudo script.sh или pkexec script.sh

Это было бы намного более хорошо с пользовательской точки зрения если сценарий, который попросили пароля от пользователя, просто выполнив его по имени script.sh.

Как я могу "встроить" запрос в pkexec или sudo запускать целый скрипт с полномочием пользователя root?

Обратите внимание что выполнение всего с sudo sh -c не могло бы быть лучшее решение, поскольку у меня есть функции в сценарии.

23
задан 16 March 2016 в 07:16

6 ответов

Это будет работать:

echo "$(whoami)"

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

пример:

./test.sh 
blade
[sudo] password for blade: 
root
55
ответ дан 23 November 2019 в 01:22

ответ blade19899 является действительно способом пойти, однако можно было также звонить sudo bash в хижину:

#!/usr/bin/sudo bash
# ...

очевидный протест, это будет работать только, пока сценарий называют с ./script и перестанет работать, как только сценарий называют с bash script.

11
ответ дан 23 November 2019 в 01:22

Я снабжаю предисловием команды в рамках сценария, которые должны базироваться доступ с 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>. В любом случае это попросит пароль, только однажды.

6
ответ дан 23 November 2019 в 01:22

Кажется, что никто больше не обратился к очевидному беспокойству здесь. Помещение 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.
4
ответ дан 23 November 2019 в 01:22

Я сделал это этот путь:

echo -n "Enter password for sudo rights: "
read -s pass

echo $pass | sudo -S [your command here]
1
ответ дан 23 November 2019 в 01:22

Если Вы хотели бы симпатичное диалоговое окно, попробуйте что-то вроде этого. Я разорвал это прямо из чего-то еще, что я записал, таким образом, это имеет дополнительный материал, Вы, возможно, не нуждались бы или хотели бы, но это показывает общее представление:

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

sudo dialog

Это использует whiptail, который можно установить, если у Вас уже нет его:

sudo apt-get install whiptail
12
ответ дан 23 November 2019 в 01:22

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

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