comment passer une variable d'environnement à sudo su

30

J'ai essentiellement besoin de faire ceci:

DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'

Ça ne marche pas. Comment passer la variable env $ DUMMY à su? -p ne fonctionne pas avec -l.

Umang
la source
Et tout simplement sudo -iu ec2-user echo $DUMMY?
muru
1
Copie
kenorb

Réponses:

39

Vous pouvez le faire sans appeler le shell de connexion:

sudo DUMMY=dummy su ec2-user -c 'echo "$DUMMY"'

ou:

sudo DUMMY=dummy su -p - ec2-user -c 'echo "$DUMMY"'

L' -poption de sucommande conserve les variables d'environnement.

cuonglm
la source
3
Je pense que "-E" préserve les variables d'environnement sudo.ws/man/sudo.man.html
Andy
1
@Andy Mais c'est souvent interdit par la configuration sudo.
Gilles 'SO- arrête d'être méchant'
@cuonglm - merci. Cela marche. N'aurait pas dû appeler le shell de connexion.
Umang
1
@kenorb: Non, -pest l'option de su, pas sudodans ce cas
cuonglm
Il y a d'autres fils qui disent -mpréserve la variable, d'autres disent -cquelle est la différence? Et l'un des commentaires de cette réponse jours -E stackoverflow.com/questions/10488758/…
Vishrant
49

Conseil de pro: il n'y a jamais vraiment de bonne raison de courirsudo su . Pour exécuter une commande en tant qu'utilisateur différent, utilisez sudo -u username command. Si vous voulez un shell racine, exécutez sudo -iou sudo -l. Si vous avez activé le compte root, vous pouvez également exécuter suseul, mais sudo sun'est tout simplement pas utile. Et oui, je sais que tu le vois partout.

Cela dit, sudoa le -Ecommutateur qui préservera l'environnement de la session de l'utilisateur:

 -E, --preserve-env
        Indicates to the security policy that the user wishes to preserve 
        their existing environment variables.  The security policy may
        return an error if the user does not have permission to 
        preserve the environment.

Ainsi, vous devrez d'abord exporter votre variable, puis exécuter sudo -E:

$ export DUMMY=dummy
$ sudo -Eu bob bash -c 'echo $DUMMY'
dummy

Ce bash -cn'est pas nécessaire. Cependant, si je lance sudo -Eu bob echo "$DUMMY", la variable est développée avant le lancement du shell racine, de sorte qu'elle ne démontre pas que la commande fonctionne réellement:

$ sudo -u bob echo $DUMMY  ## looks like it works but doesn't
dummy
$ sudo -u bob bash -c 'echo D:$DUMMY' ## now we see it failed
D:
$ sudo -Eu bob bash -c 'echo D:$DUMMY'  ## works as expected
D:dummy
terdon
la source
2
Une meilleure façon de conserver une variable d'environnement consiste à l'ajouter à env_keepin sudoers. Peut-être comme: Defaults env_keep += "DUMMY".
lcd047
@ lcd047 mais cela préservera l'environnement pour toutes les invocations de sudo. Elle est également plus lourde pour une seule variable. Cela n'est utile que pour quelque chose qui doit toujours être exporté.
terdon
Oui, c'est un compromis, mais toutes les variables d'environnement ne sont pas également nuisibles. Il y a une différence substantielle entre le report LD_PRELOADet le report LESSCHARDEF. Je ne pense pas que la commodité devrait être l'argument gagnant ici ...
lcd047
1
@ lcd047 votre suggestion vaut certainement la peine d'être publiée comme réponse. Mon point est qu'il n'est pas pratique d'exporter des variables arbitraires. Oui, s'il y a une variable spécifique que vous souhaitez toujours exporter, c'est la voie à suivre, mais pas si vous voulez le faire une fois pour une variable définie dans la même session.
terdon
7

-E fait le travail pour moi. De l'homme sudo-

-E, Indique à la politique de sécurité que l'utilisateur souhaite conserver ses variables d'environnement existantes. La politique de sécurité peut renvoyer une erreur si l'utilisateur n'est pas autorisé à préserver l'environnement.--preserve-env

Amit Jha
la source
Malheureusement, il ne fera le travail que si votre administrateur ne vous a pas empêché d'utiliser -E.
TorstenS
0

Ce qui suit est une solution qui n'en a pas besoin pour changer la politique de sécurité.

J'ignorerai la supartie, car nous pouvons utiliser l' --useroption de sudo.

Nous voulons passer des variables d'environnement à un commandrun via sudo. Cependant sudo, les variables d'environnement ne seront pas transmises à une commande (il existe des raisons de sécurité valables pour cela, certaines variables peuvent être dangereuses). Un shell peut être utilisé pour définir des variables d'environnement et sudopeut exécuter un shell avec un script qui lui est transmis. Par conséquent, dites sudod'exécuter un script qui définit les variables d'environnement.

var_a=someThing
var_b=someOtherThing

sudo bash -c "
    export var_a=\"${var_a}\"
    export var_b=\"${var_b}\"

    the_command some_args
"
ctrl-alt-delor
la source