Moyen approprié de laisser l'utilisateur saisir le mot de passe d'un script bash en utilisant uniquement l'interface graphique (avec le terminal caché)

8

J'ai créé un script bash qui utilise kdialog exclusivement pour interagir avec l'utilisateur. Il est lancé à partir d'un fichier ".desktop" afin que l'utilisateur ne voie jamais le terminal. Il ressemble à 100% à une application graphique (même s'il ne s'agit que d'un script bash). Il fonctionne uniquement dans KDE (Kubuntu 12.04).

Mon seul problème est de gérer la saisie de mot de passe de manière sécurisée et pratique. Je ne trouve pas de solution satisfaisante.

Le script a été conçu pour être exécuté en tant qu'utilisateur normal et pour demander le mot de passe lorsqu'une commande sudo est nécessaire pour la première fois. De cette façon, la plupart des commandes, celles qui ne nécessitent pas de droits sudo, sont exécutées en tant qu'utilisateur normal. Ce qui se passe (lorsque le script est exécuté à partir du terminal) est que l'utilisateur est invité à entrer son mot de passe une fois et le délai d'expiration sudo par défaut permet au script de se terminer, y compris toutes les commandes sudo supplémentaires, sans inviter à nouveau l'utilisateur. C'est ainsi que je veux que cela fonctionne également lorsqu'il est exécuté derrière l'interface graphique.

Le problème principal est que l'utilisation de kdesudopour lancer mon script, qui est la manière standard de l'interface graphique, signifie que le script entier est exécuté par l'utilisateur root. Ainsi, la propriété des fichiers est attribuée à l'utilisateur racine, je ne peux pas compter sur les ~/chemins d'accès et bien d'autres choses ne sont pas idéales. L'exécution de l'intégralité du script en tant qu'utilisateur root n'est qu'une solution très insatisfaisante et je pense que c'est une mauvaise pratique.

J'apprécie toutes les idées pour permettre à un utilisateur d'entrer le mot de passe sudo une seule fois via l'interface graphique sans exécuter le script entier en tant que root. Merci.

MountainX
la source

Réponses:

14

L' -Aoption sudo vous permet de spécifier un programme d'assistance (dans la variable SUDO_ASKPASS) qui demandera le mot de passe.

Créez un script pour demander le mot de passe (myaskpass.sh):

#!/bin/bash
zenity --password --title=Authentication

Insérez ensuite cette ligne au début de votre script:

export SUDO_ASKPASS="/path/to/myaskpass.sh"

et remplacer toutes les occurrences de sudo <command>par:

sudo -A <command>

Vous pouvez utiliser le programme de demande de mot de passe de votre choix à la place zenity. J'ai dû l'encapsuler dans un script car SUDO_ASKPASS doit pointer vers un fichier, donc cela ne fonctionnera pas avec l' --passwordoption requise par zenity.

Ce qui précède fonctionne comme un charme s'il s'exécute à partir de la ligne de commande ou si vous choisissez Exécuter dans le terminal après avoir double-cliqué sur le fichier de script dans le gestionnaire de fichiers, mais si vous choisissez Exécuter ou essayez de le lancer à partir d'un fichier .desktop, tout sudole monde demandera le pour le mot de passe à nouveau.


Si vous ne voulez pas du tout de fenêtre de terminal, vous pouvez stocker le mot de passe dans une variable et le diriger vers sudo -S. Il y a peut-être des problèmes de sécurité, mais je pense que c'est assez sûr (lire les commentaires sur cette réponse ).

Insérez cette ligne au début de votre script:

PASSWD="$(zenity --password --title=Authentication)\n"

et remplacer toutes les occurrences de sudo <command>par:

echo -e $PASSWD | sudo -S <command>
Eric Carvalho
la source
Je vous remercie. C'est très intéressant. Cependant, lorsque vous utilisez cela, le délai d'attente sudo habituel (par exemple, 15 minutes) est perdu. Mon script, qui contient plus de 50 commandes sudo, demande maintenant le mot de passe de l'utilisateur plus de 50 fois! J'ai fait une petite recherche sur Google et je n'ai pas vu de solution. En connaissez-vous un?
MountainX
Merci pour la mise à jour. L'alternative que vous proposez est quelque chose que j'avais exclu pour des raisons de sécurité, mais à la lecture des commentaires sur le lien que vous avez fourni, je pense que c'est probablement suffisamment sécurisé. Et c'est un moyen facile de résoudre le problème. Je vous remercie.
MountainX
Tester sur mon système, il doit être sudo -s(minuscule s) et non sudo -S(majuscule s).
WinEunuuchs2Unix
0

Ceci est basé sur l'excellente réponse d'Eric Carvalho. Je le poste pour expliquer le problème que j'ai rencontré. Plus précisément, lorsque vous utilisez ceci, le délai d'attente sudo habituel (par exemple, 15 minutes) est perdu. Mon script, qui contient plus de 50 commandes sudo, demande maintenant le mot de passe de l'utilisateur plus de 50 fois!

Voici un exemple de travail complet de toutes les parties de la solution. Il se compose d'un script bash, d'un script "myaskpass" comme Eric l'a suggéré, et d'un fichier ".desktop". Le tout devrait être 100% GUI (pas d'interaction du terminal du tout), donc le fichier .desktop est essentiel (afaik).

$ cat myaskpass.sh 
#!/bin/bash
kdialog --password "Please enter your password: "
exit 0


$ cat askpasstest1.desktop 
#!/usr/bin/env xdg-open
[Desktop Entry]
Comment=SUDO_ASKPASS tester1
Exec=bash /home/user/test/askpasstest1.sh
GenericName=SUDO_ASKPASS tester1
Name=SUDO_ASKPASS tester1
NoDisplay=false
Path[$e]=
StartupNotify=true
Terminal=false
TerminalOptions=
Type=Application
Categories=Application;Utility;
X-KDE-SubstituteUID=false
X-KDE-Username=

Et un script de test lui-même. Celui-ci vous demandera votre mot de passe deux fois lors de l'utilisation de cette solution. (Normalement, il ne demanderait qu'une seule fois en raison du délai d'attente sudo par défaut.)

#!/bin/bash

sudo -k
SUDO_ASKPASS="/home/user/test/myaskpass.sh" sudo -A touch filemadeas_askpass1
touch filemadeas_regularuser1
SUDO_ASKPASS="/home/user/test/myaskpass.sh" sudo -A touch filemadeas_askpass2
touch filemadeas_regularuser2
ls -la filemadeas* > /home/user/test/fma.log
kdialog --title "Files Created" --textbox /home/user/test/fma.log 640 480
sudo rm filemadeas_*
rm fma.log

exit 0
MountainX
la source
En exécutant ce script à partir de la ligne de commande, le mot de passe n'est demandé qu'une seule fois. En cours d'exécution à partir de l'interface graphique (en cliquant sur .desktop ou .sh dans le gestionnaire de fichiers), chaque sudo -Anouveau mot de passe. Je vais essayer de comprendre cela.
Eric Carvalho
Je viens de mettre à jour ma réponse.
Eric Carvalho
Eric ... as-tu trouvé une solution au problème?
anthony
0

Le script suivant fonctionne via la ligne de commande, le fichier de bureau ou double-cliquez, ne demande le mot de passe qu'une seule fois, et le modèle de commande sudo -Sp '' <your command here> <<<${sudo_password}peut être utilisé plusieurs fois n'importe où dans le fichier:

    # get sudo password
    sudo_password=$( gksudo --print-pass --message="Provide permission to make system changes: Type your password or press Cancel." -- : 2>/dev/null )
    # check for null entry or cancellation
    if [[ ${?} != 0 || -z ${sudo_password} ]]
    then
        exit 4
    fi
    if ! sudo -kSp '' [ 1 ] <<<${sudo_password} 2>/dev/null
    then
        exit 4
    fi
    # command
    sudo -Sp '' gedit "/etc/hosts" <<<${sudo_password}
Sadi
la source