Réponses:
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' -p
option de su
commande conserve les variables d'environnement.
-p
est l'option de su
, pas sudo
dans ce cas
-m
préserve la variable, d'autres disent -c
quelle est la différence? Et l'un des commentaires de cette réponse jours -E
stackoverflow.com/questions/10488758/…
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 -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
commutateur 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 -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, 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
env_keep
in sudoers
. Peut-être comme: Defaults env_keep += "DUMMY"
.
sudo
. Elle est également plus lourde pour une seule variable. Cela n'est utile que pour quelque chose qui doit toujours être exporté.
LD_PRELOAD
et le report LESSCHARDEF
. Je ne pense pas que la commodité devrait être l'argument gagnant ici ...
-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
Ce qui suit est une solution qui n'en a pas besoin pour changer la politique de sécurité.
J'ignorerai la su
partie, car nous pouvons utiliser l' --user
option de sudo
.
Nous voulons passer des variables d'environnement à un command
run 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 sudo
peut exécuter un shell avec un script qui lui est transmis. 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
"
sudo -iu ec2-user echo $DUMMY
?