web-dev-qa-db-fra.com

Demander le mot de passe Sudo jusqu'à ce que le mot correct soit fourni et le stocker dans la variable de script bash

Je voudrais supprimer la nécessité pour l'utilisateur de taper un mot de passe plusieurs fois pour un script bash qui exécute des commandes Sudo. Comment puis-je boucle pour mot de passe jusqu'à ce que quelque chose comme Sudo echo retourne 0, puis enregistrez le mot de passe dans une variable à utiliser à l'échelle du script?

2
maqp

Il est certainement possible de ne plus avoir besoin de saisir le mot de passe Sudo pour des commandes spécifiques ou même des scripts entiers.

Votre chemin suggéré pour stocker le mot de passe dans une variable locale dans le script est plutôt imprudent. Toute personne disposant de droits de lecture sur /proc/<pid>/environ peut lire les variables locales. Toute personne qui obtient un accès en lecture à un script, avec des informations d'identification codées en dur, peut utiliser ces informations d'identification pour attribuer des privilèges permettant de rooter et de posséder votre système. Sur un système à utilisateur unique, cela n’est toujours pas judicieux, car le nombre d’attaques distantes ciblant les utilisateurs Linux augmente.

Sans les détails de votre script, je ne peux que vous conseiller de lire le wiki de la communauté Ubuntu - Sudoers . Puis modifiez votre fichier sudoers en exécutant Sudo visudo pour ajouter les commandes spécifiques au fichier.

Il est probable que vous deviez ajouter deux lignes, l'une pour ajouter un alias de commande, et l'autre pour autoriser les utilisateurs à exécuter ces commandes.

Un exemple permettant à un utilisateur spécifique, par exemple, bob, d’exécuter des commandes d’arrêt sélectionnées sans mot de passe.

Cmnd_Alias SHUTDOWN_CMDS = /sbin/poweroff, /sbin/halt, /sbin/reboot
bob ALL=(ALL) NOPASSWD: SHUTDOWN_CMDS

Le script suivant illustre comment inclure, dans un script, la possibilité d’installer, de désinstaller ou de modifier les exemples de lignes dans /etc/sudoers.

#!/bin/bash

#Set Script Name variable
SCRIPT=`basename ${BASH_SOURCE[0]}`

#Initialize variables to default values.
OPT_i=i
OPT_u=u
OPT_e=e
OPT_m=m

#Set fonts for Help.
NORM=`tput sgr0`
BOLD=`tput bold`
REV=`tput smso`

#Help function
function HELP {
  echo -e \\n"Help documentation for ${BOLD}${SCRIPT}.${NORM}"\\n
  echo -e "${REV}Basic usage:${NORM} ${BOLD}$SCRIPT file.ext${NORM}"\\n
  echo "Command line switches are optional. The following switches are recognized."
  echo "${REV}-1${NORM}  --Installs lines in /etc/sudoers to allow script to be run without entering password multiple times."
  echo "${REV}-u${NORM}  --Unistalls lines in /etc/sudoers."
  echo "${REV}-e${NORM}  --Launces visudo to edit /etc/sudoers."
  echo "${REV}-m${NORM}  --Launces main."
  echo -e "${REV}-h${NORM}  --Displays this help message. No further functions are performed."\\n
  exit 1
}

#Install function
function INSTALL {
echo "launching Install"
echo -e '#script_append'\\n'Cmnd_Alias SHUTDOWN_CMDS = /sbin/poweroff, /sbin/halt, /sbin/reboot'\\n'bob ALL=(ALL) NOPASSWD: SHUTDOWN_CMDS' | Sudo EDITOR='tee -a' visudo
}

#Unnstall function
function UNINSTALL {
echo "launching uninstall"
bash -c 'printf ",g/^#script_append$/d\nw\nq\n" | Sudo EDITOR='ed' visudo'
bash -c 'printf ",g/^Cmnd_Alias.*reboot$/d\nw\nq\n" | Sudo EDITOR='ed' visudo'
bash -c 'printf ",g/^bob ALL=(ALL) NOPASSWD: SHUTDOWN_CMDS$/d\nw\nq\n" | Sudo EDITOR='ed' visudo'
}

#Main function
function MAIN {
echo "launching editor via main"
Sudo visudo
}

#Check the number of arguments. If none are passed, print help and exit.
NUMARGS=$#
echo -e \\n"Number of arguments: $NUMARGS"
if [ $NUMARGS -eq 0 ]; then
  HELP
fi

### Start getopts code ###

#Parse command line flags
#If an option should be followed by an argument, it should be followed by a ":".
#Notice there is no ":" after "h". The leading ":" suppresses error messages from
#getopts. This is required to get my unrecognized option code to work.

while getopts ":iuemh" FLAG; do
  case "${FLAG}" in
    i)  #set option "i"
     OPT_i=${OPTARG}
      echo "-i used: $OPTARG"
      if Sudo grep -q '#script_append' /etc/sudoers
                then 
                    echo "Sudoers apperes to have already been installed"
                    exit
                else 
                    INSTALL
            fi
      ;;
    u)  #set option "u"
      OPT_u=$OPTARG
      echo "-u used: $OPTARG"
      UNINSTALL
      ;;
    e)  #set option "e"
      OPT_e=$OPTARG
      echo "-e used: $OPTARG"
      Sudo visudo
      ;;
    m)  #set option "m"
      OPT_m=$OPTARG
      echo "-m used: $OPTARG"
      MAIN
      ;;
    h)  #show help
      HELP
      ;;
    \?) #unrecognized option - show help
      echo -e \\n"Option -${BOLD}$OPTARG${NORM} not allowed."
      HELP
      #If you just want to display a simple error message instead of the full
      #help, remove the 2 lines above and uncomment the 2 lines below.
      #echo -e "Use ${BOLD}$SCRIPT -h${NORM} to see the help documentation."\\n
      #exit 2
      ;;
  esac
done

shift $((OPTIND-1))  #This tells getopts to move on to the next argument.

### End getopts code ###
2
J. Starnes