Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/01/2018, à 07:15

gigiair

[Résolu] identification dans un script bash

Je ne me sens pas vraiment pro dans l'écriture des sciripts bash, j'ai vaguemant parcouru Abs...
J'ai placé un test dans mon script pour détecter si j'étais root ou non

echo "EUID=$EUID"
if [[ $EUID -ne 0 ]]
then
   echo "Je ne suis pas root"
else
    echo "Je suis root"
fi

Lancé depuis un terminal xfce en mode USER la valeur de $EUID est "" et ce code déclenche une erreur.
Par contre, évalué dans Emacs (en sh-mode) pas de problème.

Quelle est la solution ?

Dernière modification par gigiair (Le 26/01/2018, à 13:12)


--
JJR.

Hors ligne

#2 Le 26/01/2018, à 08:22

DonutMan75

Re : [Résolu] identification dans un script bash

Hello,
chez moi $EUID est bien positionné mais ce n'est vraisemblablement pas le cas partout.
Tu peux utiliser la commande id -u qui fait exactement la même chose.

[ $(id -u) -eq 0 ] && echo "Je s'appelle ROOT" || echo "Je ne suis pas ROOT"

Explications succintes :
$(id -u) retourne l'UID actuel
[ $(id -u) -eq 0 ]  compare cette valeur à 0 (uid de root)
&& echo "je s'appelle root" : ET logique, SI la commande à gauche renvoie vrai ALORS on imprime "je s'appelle ROOT"
|| echo "Je ne suis pas ROOT" : OU logique, SI la commande à gauche échoue, ALORS on imprime "Je ne suis pas ROOT"

Tiens d'ailleurs j'ai testé et ça marche. mais je ne suis pas sûr des priorité des opérateurs && et ||... Pour faire des groupements logiques, il faudrait utiliser ( ) ??

Bonne journée à tous,

Donut

Hors ligne

#3 Le 26/01/2018, à 08:25

pingouinux

Re : [Résolu] identification dans un script bash

Bonjour,

gigiair #1 a écrit :

la valeur de $EUID est "" et ce code déclenche une erreur.

Quelle erreur ? Chez moi, lancé depuis un gnome-terminal, ça marche.

Édité :
Autre façon de faire :

[ $(whoami) = root ] && echo "Je suis root" || echo "Je ne suis pas root"

Dernière modification par pingouinux (Le 26/01/2018, à 08:32)

Hors ligne

#4 Le 26/01/2018, à 08:35

gigiair

Re : [Résolu] identification dans un script bash

J'ai essayé xterm, Uxterm, sans succès. J'ai également essayé le mode shell d'Emacs, pareil.
Par contre, lorsque j'édite le code dans Emacs la fonction sh-execute-region ne pose pas de problème.
Voici mon script : martyr.sh

wget http://ix.io/EHm -O martyr.sh
cat martyr.sh #vérifier qu'il n'y a pas de rootkit !
sh martyr.sh
EUID=
./martyr.sh: 7: ./martyr.sh: [[: not found
Je suis root
debjjr@elfie:~/Documents/Bash$ 

J'ai eu l'idée de ta solution. Je quoterais chaînes de caractère, c'est une habitude chez moi.
Dans la littérature Bash, l'identification de l'utilisateur root se fait avec $EUID. Est-ce une question de sécurité de ne plus avoir accès à cette variable ?

Dernière modification par gigiair (Le 26/01/2018, à 09:12)


--
JJR.

Hors ligne

#5 Le 26/01/2018, à 10:39

MicP

Re : [Résolu] identification dans un script bash

Bonjour

./martyr.sh: 7: ./martyr.sh: [[: not found

Si tu utilises une syntaxe bash ( [[ ) dans ton script
et que tu lances le script en utilisant /bin/sh
c'est logique que l'interpréteur de commandes /bin/dash te retourne ce message d'erreur.

=======
Si tu as spécifié dans le shebang de ton script d'utiliser l'interpréteur de commandes /bin/bash,
lance le avec l'interpréteur de commandes /bin/bash
ou rends le script exécutable pour le lancer directement et son shebang sera pris en compte.

=======
NOTE :

Un copié/collé complet nous permettrait de connaître
le type de compte utilisateur qui a été utilisé pour lancer le script,
et surtout la ligne de commande(s) qui a été utilisée.

=======
=======

michel@debg53sw:~$ wget http://ix.io/EHm -O martyr.sh      # je récupère ton script
--2018-01-26 11:01:30--  http://ix.io/EHm
Résolution de ix.io (ix.io)… 66.172.11.73
Connexion à ix.io (ix.io)|66.172.11.73|:80… connecté.
requête HTTP transmise, en attente de la réponse… 200 OK
Taille : 267 [text/plain]
Sauvegarde en : « martyr.sh »

martyr.sh                          100%[==================================================================>]     267  1,56KB/s   ds 0,2s   

2018-01-26 11:01:31 (1,56 KB/s) — « martyr.sh » sauvegardé [267/267]

michel@debg53sw:~$ 
michel@debg53sw:~$ cat ./martyr.sh                         # j'en affiche le contenu
#!/bin/bash
# ------------------------------------------------------------------

# -----------------------------------------------------------------

echo "EUID=$EUID"
if [[ !  "$USER" -ne "root" ]]
then
   echo "Je ne suis pas root"
else
    echo "Je suis root"
fi
michel@debg53sw:~$ 
michel@debg53sw:~$ chmod u+x martyr.sh                     # je le rends exécutable par mon compte utilisateur 
michel@debg53sw:~$ 
michel@debg53sw:~$ ls -l ./martyr.sh                       # je vérifie les attributs de martyr.sh pour savoir s'il est bien exécutable
-rwxr--r-- 1 michel michel 265 janv. 26 11:17 ./martyr.sh
michel@debg53sw:~$ 
michel@debg53sw:~$ ./martyr.sh                             # je lance le script en spécifiant son chemin ( ./ <=> répertoire courant )
EUID=1000
Je ne suis pas root
michel@debg53sw:~$ 
michel@debg53sw:~$ sed -i 's/bash/sh/' ./martyr.sh         # je modifie le shebang /bin/bash par /bin/sh
michel@debg53sw:~$ 
michel@debg53sw:~$ cat ./martyr.sh                         # je vérifie la modification
#!/bin/sh
# ------------------------------------------------------------------

# -----------------------------------------------------------------

echo "EUID=$EUID"
if [[ !  "$USER" -ne "root" ]]
then
   echo "Je ne suis pas root"
else
    echo "Je suis root"
fi
michel@debg53sw:~$ 
michel@debg53sw:~$ ls -l ./martyr.sh                        # je vérifie les attributs de martyr.sh pour savoir s'il est bien exécutable
-rwxr--r-- 1 michel michel 265 janv. 26 11:17 ./martyr.sh
michel@debg53sw:~$ 
michel@debg53sw:~$ ./martyr.sh                              # je lance le script en spécifiant son chemin
EUID=
./martyr.sh: 7: ./martyr.sh: [[: not found
Je suis root
michel@debg53sw:~$ 
michel@debg53sw:~$ /bin/bash ./martyr.sh                    # je le lance avec l'interpréteur /bin/bash => le shebang /bin/sh du script ne sera pas pris en compte
EUID=1000
Je ne suis pas root
michel@debg53sw:~$ 

Dernière modification par MicP (Le 26/01/2018, à 11:39)

Hors ligne

#6 Le 26/01/2018, à 11:25

gigiair

Re : [Résolu] identification dans un script bash

Bon le problème est résolu, je n'avais pas percuté que lancer un script bash avec sh ne permettait pas d'accéder à $EUID qui est une variable de l'environnement de bash. Au temps pour moi, et merci.


--
JJR.

Hors ligne

#7 Le 28/01/2018, à 09:32

Zakhar

Re : [Résolu] identification dans un script bash

Et il vaut mieux éviter les "bashisms" précisément pour cette raison. Ecrire "portable" évite de se creuser la tête des heures pour ce genre de choses. smile


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne