Quel est le but de «true» dans bash «if sudo true; ensuite"


20

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

2
Si vous allez voter contre la question, pourriez-vous expliquer ce que je peux faire pour améliorer la question? N'est-ce pas le bon site de débordement?
Matt Parkins

4
Je ne sais pas d'où viennent les downvotes; essayez-vous de nier la déclaration ou de l' annuler ? Vous dites que vous voulez vous débarrasser à la fois du vrai / écho et du "sinon", alors quel est votre objectif final?
Jeff Schaller


1
@ ctrl-alt-delor suivant ce lien, il semble que tout ce que je dois faire est de mettre un point d'exclamation devant le sudo et ensuite je peux supprimer à la fois l'écho et le reste, et maintenant je l'ai testé, cela fonctionne, merci.
Matt Parkins

2
En passant, vous devriez probablement rediriger le message d'erreur vers le flux d'erreur:echo "Aborting script" >&2
Toby Speight

Réponses:


38

truein 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, falseest 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;

true
echo $? # 0
false
echo $? #1

if sudo truen'est pas équivalent à if sudo == true. if sudo trueexécute le trueprogramme à l'aide sudoet vérifie le code de sortie.

Donc:

if sudo false; thenexécute le programme en falsetant que sudo. Le retour sera toujours faux.

if sudo true == falseexécutera le programme trueavec les arguments ==et en falseutilisant sudo. Ce n'est évidemment pas ce que vous vouliez.

if [!(sudo true)] est une syntaxe non valide.

Ce que vous cherchez probablement

if ! sudo true;

12
Comme correction légèrement pédante de la première phrase: en bash , trueet falsesont 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 trueil exécutera le programme autonome, pas le bash intégré.
IMSoP

31
PS: mes résumés préférés trueet falsesont les titres sur leurs pages de manuel: true - do nothing, successfullyetfalse - do nothing, unsuccessfully
IMSoP

3
@IMSoP C'est profond.
brainplot

2
S'il truen'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.
nigel222

2
Dans AT&T SYSV Unix, "true" était un script shell / bin / true, qui consistait en un grand avis de copyright dans les commentaires ... et rien d'autre.
Lee Daniel Crocker

21

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 trueprogramme, comme expliqué dans la réponse acceptée.


1
Essentiellement, ceci. Une alternative pourrait être de vérifier si l'utilisateur est dans le groupe sudoers, mais le simple fait de courir sudo trueest également assez facile, bien qu'un peu hacky.
Sergiy Kolodyazhnyy

3
Notez que cela nécessite également sudod'ê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.)
Mehrdad

1
L'OP veut abandonner si vous ne pouvez pas sudo, et vous débarrasser de deux lignes plutôt que d'avoir un autre suite à un noop.
mckenzm

2
Et, à l'inverse, vous pouvez également le faire sudosans ê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ême sudo truen'est pas infaillible, car l' sudoaccès ne peut être accordé que pour des commandes spécifiques, vous pouvez donc le faire sudo true, mais pas sudo 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écuter sudo.
Dave Sherohman

2
En outre, vous pouvez faire partie du sudoersgroupe et ne pas pouvoir le faire sudocar le sudoersgroupe n'est pas répertorié dans le sudoersfichier. Un groupe avec les quatre lettres sudode 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 utilisant sudo.
jrw32982 prend en charge Monica

5

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.


1
Les seules commandes qui passent par sudo sont sudo trueet sudo -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.
ilkkachu

J'ai écrit: "Donc, dans ce cas, s'ils doivent exécuter une commande avec sudo, il vérifie d'abord au début, en ne demandant le mot de passe qu'une seule fois."
Luciano Andress Martini
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.