[Bash] Distinger un script lancé en sudo ou par root ?

Bonjour,

Je suis en train d’écrire un script bash qui contient des actions qui doivent être lancées uniquement par root.
Y’a il un moyen de savoir si le script à été lancé par sudo (afin de distinguer cela d’un lancement en étant “réellement” root) ?
Tout cela car je ne veux pas mettre de sudo devant les actions de mon script (car sous root ca marcherai plus :p)

Merci :slight_smile:

Salut,

[quote=“Gui-59”]Bonjour,

Je suis en train d’écrire un script bash qui contient des actions qui doivent être lancées uniquement par root.
Y’a il un moyen de savoir si le script à été lancé par sudo (afin de distinguer cela d’un lancement en étant “réellement” root) ?
Tout cela car je ne veux pas mettre de sudo devant les actions de mon script (car sous root ca marcherai plus :p)

Merci :)[/quote]

Expliques, exemples à l’appui ? :119

Je ne suis plus sur mais je crois qu’avec sudo, tu as l’UID réelle qui est pas celle de root. Après faut voir la pertinence de tel scripts en effet, mais pour voir les éventuels différence lance la commande env avec sudo et en root.

sudo env

[quote]LOGNAME=root
USER=root
USERNAME=root
SUDO_COMMAND=/usr/bin/env
SUDO_USER=gerard
SUDO_UID=1000
SUDO_GID=1000
[/quote]

Dans mon sudoers j’ai :

C’est pas fait pour ça justement ???

L’UID doit être différent

Merci de vos réponses :slight_smile:

En fait, tout ce que je voulais faire c’est un script dans lequel je puisse faire (par exemple) :

#!/bin/bash
apt-get install gedit

et qui fonctionne aussi bien si lancé en sudo ou en su …

Mais après de nouveau test, il semble que ca marche aussi bien dans les 2 cas … Désolé pour le dérangement :frowning:

Ce qui me semble logique vue que SUDO “emprunte” les droits root pour lancer une commande. Donc tout ce que ton script contient seras exécuter de la même manière que si le compte root l’avais lancé lui même. :mrgreen:

Salut,

je débarque un peu tard pour répondre, mais je suis tombé sur ce sujet par hazard suite à une recherche Google.
Pour répondre simplement à ta question, il suffit d’utiliser la variable $EUID… :wink:
La preuve par le code:

[roberto@roberto-desk ~]$ echo $EUID 1000 [roberto@roberto-desk ~]$ sudo echo $EUID 1000 [roberto@roberto-desk ~]$ su Mot de passe : [root@roberto-desk roberto]# echo $EUID 0

Problème résolu, je pense… :114

Il y a certains dossiers/fichiers qui refusent l’ouverture avec sudo, même si l’user est “pleins pouvoirs”.
Je ne me souviens plus desquels mais j’en déduis que ça doit se règler avec certains droits, non :question:

Il y a une faille dans ton exemple : la variable $EUID est évaluée dans le contexte du shell qui exécute la commande sudo, et non de celui exécuté par sudo.

Salut,

Il y a une faille dans ton exemple : la variable $EUID est évaluée dans le contexte du shell qui exécute la commande sudo, et non de celui exécuté par sudo.[/quote]

Merci Pascal,

Par expérience, depuis quelques jours le script “SMXI” ne peut plus être exécuté par SUDO même si l’utilisateur est habilité à l’exécuter. Ils sont donc capables de faire la différence :slightly_smiling:

[quote=“ggoodluck47”]Salut,

Il y a une faille dans ton exemple : la variable $EUID est évaluée dans le contexte du shell qui exécute la commande sudo, et non de celui exécuté par sudo.[/quote]

Merci Pascal,

Par expérience, depuis quelques jours le script “SMXI” ne peut plus être exécuté par SUDO même si l’utilisateur est habilité à l’exécuter. Ils sont donc capables de faire la différence :slightly_smiling:[/quote]

CQFD: le seul moyen simple pour un bash afin de faire la différence entre un utilisateur de base (qui a éventuellement le privilège “root”) et l’admistrateur, c’est la variable dont je parlais… :wink:

Non. Cf. man sudo :

Les deux valeurs UID et EUID sont celles de l’utilisateur cible (root).
Je répète : ton exemple est erroné car il prend la valeur de la variable $EUID avant l’exécution de sudo, pas pendant.

/etc/profile

[code]

/etc/profile: system-wide .profile file for the Bourne shell (sh(1))

and Bourne compatible shells (bash(1), ksh(1), ash(1), …).

if [ “id -u” -eq 0 ]; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH

if [ “$PS1” ]; then
if [ “$BASH” ] && [ “$BASH” != “/bin/sh” ]; then
# The file bash.bashrc already sets the default PS1.
# PS1=’\h:\w$ ‘
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ “id -u” -eq 0 ]; then
PS1=’# ‘
else
PS1=’$ '
fi
fi
fi

The default umask is now handled by pam_umask.

See pam_umask(8) and /etc/login.defs.

if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi[/code]
Le $PATH,$PS1 prompt ($/#) sont affectés selon l’id.
Passage qui nous intéresse :
if [ “id -u” -eq 0 ] : si la commande id -u retourne 0, root est de la partie.

Variable $EUID
Test à blanc de hack innocent

$ export EUID=0 bash: EUID: readonly variable

$ man bash

       EUID   Expands  to  the  effective  user  ID of the current user, initialized at shell startup.  This variable is readonly.[/code]
readonly, lecture seule, pas hackable ...

L'une des différence entre sudo et su réside dans les log.
L'activité de su et de sudo ne se confondent pas.

su : login
sudo : logging

Login, ([i]a log IN/log OUT[/i]), s'identifier, s'authentifier, se connecter, commencer session.
Logging :frowning:[i]to log a log[/i]) enregistrer rapport d'activité.
$ man sudoers
[code]LOG FORMAT
     sudoers can log events using either syslog(3) or a simple log file.  In each case the log format is almost
     identical.

   Accepted command log entries
     Commands that sudo runs are logged using the following format (split into multiple lines for readability):

         date hostname progname: username : TTY=ttyname ; PWD=cwd ; \
             USER=runasuser ; GROUP=runasgroup ; TSID=logid ; \
             ENV=env_vars COMMAND=command

     Where the fields are as follows:

     date          The date the command was run.  Typically, this is in the format “MMM, DD, HH:MM:SS”.  If logging
                   via syslog(3), the actual date format is controlled by the syslog daemon.  If logging to a file
                   and the log_year option is enabled, the date will also include the year.

     hostname      The name of the host sudo was run on.  This field is only present when logging via syslog(3).

     progname      The name of the program, usually sudo or sudoedit.  This field is only present when logging via
                   syslog(3).

     username      The login name of the user who ran sudo.

     ttyname       The short name of the terminal (e.g. “console”, “tty01”, or “pts/0”) sudo was run on, or
                   “unknown” if there was no terminal present.

     cwd           The current working directory that sudo was run in.

     runasuser     The user the command was run as.

     runasgroup    The group the command was run as if one was specified on the command line.

     logid         An I/O log identifier that can be used to replay the command's output.  This is only present when
                   the log_input or log_output option is enabled.

     env_vars      A list of environment variables specified on the command line, if specified.

     command       The actual command that was executed.

Cas exceptionnel : sudo lancé par root (# sudo).