Demander le mot de passe sudo et élever par programme le privilège dans le script bash?

49

Je travaille actuellement sur un script bash qui installe et configure divers programmes sur un système Linux standard (actuellement Ubuntu). Puisqu'il installe des programmes et copie un certain nombre de fichiers dans divers dossiers qui nécessitent des privilèges élevés, j'ai déjà réalisé le standard "J'ai besoin de privilèges élevés".

Cependant, je souhaiterais, si possible, pouvoir demander à l'utilisateur son mot de passe sudo et élever automatiquement les privilèges du script si l'utilisateur n'exécute pas la commande de script avec sudo (par exemple, en le lançant à partir du gestionnaire de fichiers de l'interface graphique), sans que l'utilisateur ait à redémarrer le script.

Comme cela est conçu pour fonctionner sur des installations Linux courantes, toute option qui modifie le système ne fonctionnera pas pour mes besoins. Toutes les options doivent être contenues dans le script lui-même.

Est-ce possible dans Bash? Si tel est le cas, quel est le meilleur moyen (sûr mais concis) de le faire?

Shauna
la source
@MichaelMrozek - Ah, la joie d'avoir autant de sites de niche tout en essayant de minimiser la fragmentation. Et vous savez, le lien que vous avez donné ne m'a jamais été cité lors de la recherche sur Google.
Shauna
@jww vous réalisez que presque tous ces liens ont été demandés environ 4 ans après celui-ci, n'est-ce pas?
Shauna
1
@Shauna - Je suppose que vous avez résolu le problème maintenant. Les liens sont pour les futurs visiteurs.

Réponses:

64

Je lance sudodirectement à partir du script:

if [ $EUID != 0 ]; then
    sudo "$0" "$@"
    exit $?
fi
Michael Mrozek
la source
16

Je suggère:

#!/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
enzotib
la source
Qu'est-ce que if [[ -t 1 ]];vérifier?
Shauna
Ah ok. Je pensais que cela avait quelque chose à voir avec le terminal vs l'interface graphique, mais je n'étais pas sûr de ce que l'instruction if vérifiait elle-même.
Shauna
Incroyable, merci!
Fire-Dragon-DoL
16

Ajoutez ceci comme première ligne du script:

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

Changement sudoà gksuou gksudosi vous préférez une invite graphique.

Kevin
la source
3
Notez que cela "$*"va fusionner tous les arguments en un seul (cela /path/to/script one two threeva donner lieu à $1être one two three), et $*sans guillemets, les espaces seront gâchés par des arguments. "$@"fonctionne bien
Michael Mrozek
@MichaelMrozek Ah, c'est vrai. C’est celui que je cherchais, corrigé
Kevin le
Y a-t-il un moyen de faire cela sur Debian, où il semble n'y avoir aucune commande sudo?
wrongusername
@wrongusername install sudo, c'est bien mieux que d'utiliser su. Mais si vous voulez vraiment, probablementexec su -c "$0" "$@"
Kevin
2

exemple de script je ne me dérange pas de partager:

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

--ImP.TeK

TeP ImPerial. Solutions
la source
[ "$UID" -eq 0 ] || exec sudo "$0" "$@"- On dirait un one-liner vraiment efficace! Agréable!
groovenectar
Serait-il judicieux d'utiliser Effective UID ici $EUDI, ou toujours le même résultat? Par exemple,[[ "$EUID" -eq 0 ]] || exec sudo "$0" "$@"
groovenectar