J'ai piraté ensemble ce script bash qui teste si l'utilisateur a des privilèges de superutilisateur et s'ils ne le font pas, il les demande. En fin de compte, j'essaie d'inverser la deuxième instruction «if» afin de pouvoir supprimer les deux lignes suivantes (l'écho «mot de passe ok» et le reste sur la ligne suivante)
# Root user only
if [[ "$EUID" != 0 ]]; then
sudo -k # make sure to ask for password on next sudo
if sudo true; then
echo "Password ok"
else
echo "Aborting script"
exit 1
fi
fi
echo "do my ops"
Le but de "vrai" sur la quatrième ligne est-il simplement une déclaration nulle?
Je dois inverser le test sur la quatrième ligne, comment faire? Voici ce que j'ai essayé:
if sudo false; then
if sudo true == false; then
if [!(sudo true)]; then
echo "Aborting script" >&2
Réponses:
true
in bash n'est pas un mot-clé, c'est un programme qui se ferme instantanément avec un code de sortie réussi. De même,false
est un programme qui se termine avec un code de sortie infructueux.Vous pouvez essayer cela en exécutant les deux programmes à partir de votre terminal, puis en lisant la
$?
variable, qui contient le code de sortie du dernier programme;if sudo true
n'est pas équivalent àif sudo == true
.if sudo true
exécute letrue
programme à l'aidesudo
et vérifie le code de sortie.Donc:
if sudo false; then
exécute le programme enfalse
tant que sudo. Le retour sera toujours faux.if sudo true == false
exécutera le programmetrue
avec les arguments==
et enfalse
utilisantsudo
. Ce n'est évidemment pas ce que vous vouliez.if [!(sudo true)]
est une syntaxe non valide.Ce que vous cherchez probablement
la source
true
etfalse
sont des "builtins", commandes interprétées directement par le shell; dans les systèmes de type Unix en général , ils existent également en tant que programmes autonomes sur le système de fichiers. La différence n'a pas beaucoup d'importance ici, mais pour autant que je sache,sudo true
il exécutera le programme autonome, pas le bash intégré.true
etfalse
sont les titres sur leurs pages de manuel:true - do nothing, successfully
etfalse - do nothing, unsuccessfully
true
n'existait pas, le code de la question montre pourquoi on pourrait avoir besoin de l'inventer! C'est un programme minimal qui ne peut échouer que si le système sur lequel il se trouve est vraiment bork. On peut donc l'utiliser pour déterminer si ses identifiants d'accès sont OK.J'ai l'impression que la réponse acceptée n'a pas vraiment répondu à votre question?
Le but est de vérifier que vous le pouvez réellement
sudo
.La façon dont cette vérification est effectuée se fait via le
true
programme, comme expliqué dans la réponse acceptée.la source
sudo true
est également assez facile, bien qu'un peu hacky.sudo
d'être installé, de sorte que les vérifications ne seraient pas entièrement équivalentes ... vous pourriez être dans le groupe sudoers et ne pas toujours pouvoir sudo. (Cela peut notamment se produire si vous écrivez par exemple un script pour configurer une nouvelle image à partir d'un tarball rootfs minimal, qui pourrait ne pas avoir sudo.)sudo
sans être dans le groupe sudoers si vous (personnellement ou en tant que membre d'un autre groupe) êtes répertorié dans/etc/sudoers
. Mais mêmesudo true
n'est pas infaillible, car l'sudo
accès ne peut être accordé que pour des commandes spécifiques, vous pouvez donc le fairesudo true
, mais passudo something_else
, ou vice-versa. Il n'y a pas d'autre moyen de tester à toute épreuve qu'en essayant d'exécuter la commande que vous souhaitez réellement exécutersudo
.sudoers
groupe et ne pas pouvoir le fairesudo
car lesudoers
groupe n'est pas répertorié dans lesudoers
fichier. Un groupe avec les quatre lettressudo
de son nom n'est pas une indication valable de savoir si un utilisateur de ce groupe peut faire quelque chose ou quoi que ce soit en utilisantsudo
.Comme je le vois dans ce script. Il vérifie simplement si sudo est activé, c'est tout.
true renvoie juste true.
Donc, dans ce cas, s'ils doivent exécuter une commande avec sudo, il vérifie d'abord au démarrage, en ne demandant le mot de passe qu'une seule fois.
La condition fonctionne comme ceci: si sudo exécute correctement la vraie commande, elle retournera true pour la condition if, alors sudo est activé et l'utilisateur a tapé le mot de passe correctement, sinon vous avez mal tapé le mot de passe ou sudo n'est pas activé, le script ne doit pas continuer.
Les autres commandes n'ont pas besoin de demander le mot de passe sudo, car vos authentifications sont réussies la première fois (mais cela dépend de la configuration sudo, donc ces scripts dépendent beaucoup de la configuration de l'environnement)
Le mot de passe "echo ok" le démontre également. le script shell ne demandera plus le mot de passe.
la source
sudo true
etsudo -k
. Ce dernier ne nécessite explicitement pas de mot de passe. Aucune des autres commandes du script n'est exécutée via sudo, donc bien sûr, elles ne nécessitent pas de mots de passe, que l'authentification ait réussi ou non la première fois.