web-dev-qa-db-fra.com

comment passer une variable d'environnement à Sudo su

Je dois essentiellement faire ceci:

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

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

38
Umang

Vous pouvez le faire sans appeler Shell de connexion:

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

ou:

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

Le -p option de la commande su conserve les variables d'environnement.

46
cuonglm

Astuce de pro: Il n'y a jamais vraiment de bonne raison d'exécuter Sudo 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 -i ou Sudo -l. Si vous avez activé le compte root, vous pouvez également exécuter su seul, mais Sudo su n'est tout simplement pas utile. Et oui, je sais que tu le vois partout.

Cela dit, Sudo a le -E switch 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

Le bash -c n'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, ce qui 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
53
terdon

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

-E, --preserve-env
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.

7
Amit Jha

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

J'ignorerai la partie su, car nous pouvons utiliser la --user option de Sudo.

Nous voulons passer des variables d'environnement à un command exécuté via Sudo. Cependant, Sudo ne permettra pas de passer des variables d'environnement à une commande (il y a une raison de sécurité valable pour cela, certaines variables peuvent être dangereuses). Un Shell peut être utilisé pour définir des variables d'environnement et Sudo peut exécuter un Shell avec un script qui lui est passé. Par conséquent, dites à Sudo d'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
"
0
ctrl-alt-delor