У меня есть скрипт, который может работать как sudo script.sh или pkexec script.sh
. Было бы намного лучше с точки зрения пользователя, если бы скрипт попросил пароль у пользователя, когда он его запускал по имени script.sh.
Как я могу «вставить» запрос в pkexec или sudo для запуска всего скрипта с правами root?
Обратите внимание, что запуск всего с sudo sh -c может быть не лучшее решение, поскольку у меня есть функции в скрипте.
Если вам нужен хороший диалог, попробуйте что-то вроде этого. Я разорвал это прямо из чего-то другого, что написал, поэтому у него есть лишний материал, который вам может не понадобиться или не нужен, но он показывает общую идею:
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
Ответ на лезвие19899 - это действительно способ пойти, однако можно также называть sudo bash в shebang:
#!/usr/bin/sudo bash
# ...
Очевидное предостережение - это будет работать только до тех пор, пока скрипт вызывается с ./script и выйдет из строя, как только скрипт вызывается с помощью bash script.
Я предикаю команды внутри скрипта, которым нужен root-доступ с sudo - если пользователь еще не получил разрешений, скрипт запрашивает пароль в этой точке.
example
#!/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 в ваш скрипт, который вы затем распространяете, способствует плохим привычкам пользователя. (Я предполагаю, что вы распространяете его, потому что вы упоминаете «с точки зрения пользователя».)
Правда в том, что есть руководство по использованию приложений и скриптов, которые аналогичны принципу безопасности в банковском деле: никогда не выдавайте свою личную информацию тому, кто звонит вам, и говорит, что они звонят «из вашего банка» и существуют по аналогичным причинам.
Правило для приложений: [!d4 ]
способствует плохим привычкам пользователя Это относится трижды к любому, у кого есть доступ sudo.
Если вы вводите пароль, потому что вы выполнили sudo по команде линия, отлично. Если вы печатаете его, потому что вы управляете SSH-командой, отлично.
Если вы просто запускаете внешний скрипт или исполняемый файл и вводите свой пароль при появлении запроса на него, у вас есть [d3 ] Никогда не выдавайте свою личную информацию тому, кто звонит вам, и говорит, что они звонят «из вашего банка» , что сценарий делает с ним. Он может хранить его во временном файле в открытом тексте, насколько вам известно, и даже может не очиститься после себя.
Очевидно, что существуют отдельные и дополнительные проблемы при запуске неизвестного набора команд в виде [ f5], но то, о чем я говорю, это поддержка безопасности самого пароля. Даже если приложение / сценарий не является вредоносным, вы все равно хотите, чтобы ваш пароль обрабатывался безопасно, чтобы другие приложения не овладели им и не использовали его злонамеренно.
Итак, мой собственный личный ответ на это, лучше всего добавить в свой скрипт, если ему нужны привилегии 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]