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?



@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

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

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.


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


[ "$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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.