web-dev-qa-db-fra.com

Demander le privilège root depuis un script

J'ai un script qui peut fonctionner en tant que Sudo script.sh ou pkexec script.sh

Il serait beaucoup plus agréable du point de vue de l'utilisateur si le script demandait le mot de passe à l'utilisateur lorsqu'il l'exécutait simplement sous le nom script.sh.

Comment puis-je "incorporer" une demande à pkexec ou Sudo pour exécuter le script entier avec le privilège root?

Note que tout exécuter avec Sudo sh -c pourrait ne pas être la meilleure solution car j'ai des fonctions dans le script.

23

Ça va marcher:

echo "$(whoami)"

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

exemple:

./test.sh 
blade
[Sudo] password for blade: 
root
52
blade19899

Si vous souhaitez un joli dialogue, essayez quelque chose comme ça. J'ai extrait cela directement de quelque chose d'autre que j'ai écrit, donc il contient des trucs supplémentaires dont vous n'avez peut-être pas besoin ou pas envie, mais cela montre l'idée générale:

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

Cela utilise whiptail, que vous pouvez installer si vous ne l'avez pas déjà:

Sudo apt-get install whiptail
12
Michael Hampton

la réponse de blade19899 est bien la voie à suivre, mais on pourrait aussi appeler Sudo bash dans le Shebang:

#!/usr/bin/Sudo bash
# ...

L'avertissement évident est que cela ne fonctionnera que tant que le script sera appelé avec ./script et échouera dès que le script sera appelé avec bash script.

11
kos

Je fais précéder les commandes du script qui nécessitent un accès root avec Sudo - si l'utilisateur n'a pas encore obtenu les autorisations nécessaires, le script vous invite à entrer un mot de passe à ce stade.

exemple

#!/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

Ce script peut être exécuté en tant que Sudo <scriptname> ou en tant que <scriptname>. Dans les deux cas, le mot de passe ne sera demandé qu'une seule fois.

6
Charles Green

Il semble que personne d’autre n’a répondu à cette préoccupation évidente. Mettre Sudo dans votre script que vous distribuez ensuite favorise les mauvaises habitudes de l'utilisateur. (Je suppose que vous le distribuez parce que vous mentionnez "du point de vue de l'utilisateur".)

La vérité est qu’il existe des directives relatives à l’utilisation des applications et des scripts qui sont similaires au principe de sécurité en banque de: Ne communiquez jamais vos informations personnelles à une personne qui vous appelle et qui dit qu’elle vous appelle. "de votre banque" , et qui existe pour des raisons similaires.

La règle pour les applications est:

Ne tapez jamais votre mot de passe lorsque vous y êtes invité à moins que vous ne soyez certain de ce qui est fait avec. Ceci s'applique à tous les utilisateurs avec Sudo accès.

Si vous tapez votre mot de passe parce que vous avez exécuté Sudo sur la ligne de commande, c'est parfait. Si vous le tapez parce que vous avez exécuté une commande SSH, c'est bien. Si vous le tapez lorsque vous vous connectez à votre ordinateur, c'est bien sûr.

Si vous exécutez simplement un script étranger ou un exécutable et entrez votre mot de passe de façon uniforme lorsque vous y êtes invité, vous n'avez aucune idée de ce que le script en fait. Cela pourrait consister à le stocker dans un fichier temporaire en texte brut, pour autant que vous sachiez, et pourrait même échouer à se nettoyer lui-même.

Évidemment, l’exécution d’un ensemble de commandes inconnu sous le nom root soulève des préoccupations distinctes et supplémentaires, mais je parle ici du maintien de la sécurité du mot de passe lui-même . . Même en supposant que l'application/le script n'est pas malveillant, vous souhaitez tout de même que votre mot de passe soit géré de manière sécurisée afin d'empêcher d'autres applications de le récupérer et de l'utiliser de manière malveillante. .

Donc, ma réponse personnelle à ceci est que la meilleure chose à mettre dans votre script s'il a besoin de privilèges root, est:

#!/bin/bash
[ "$UID" -eq 0 ] || { echo "This script must be run as root."; exit 1;}

# do privileged stuff, etc.
4
Wildcard

Je l'ai fait de cette façon:

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

echo $pass | Sudo -S [your command here]
1
88weighed