Ich muss das im Grunde tun:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
Das geht nicht. Wie kann ich die Umgebungsvariable $ DUMMY an su übergeben? -p funktioniert nicht mit -l.
Ich muss das im Grunde tun:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
Das geht nicht. Wie kann ich die Umgebungsvariable $ DUMMY an su übergeben? -p funktioniert nicht mit -l.
Antworten:
Sie können dies tun, ohne die Login-Shell aufzurufen:
sudo DUMMY=dummy su ec2-user -c 'echo "$DUMMY"'
oder:
sudo DUMMY=dummy su -p - ec2-user -c 'echo "$DUMMY"'
Mit -p
der su
Befehlsoption werden Umgebungsvariablen beibehalten.
-p
ist Option su
, sudo
in diesem Fall nicht
-m
die Variable erhalten bleibt, andere besagen, -c
was ist der Unterschied? Und einer der Kommentare in dieser Antwort Tage -E
stackoverflow.com/questions/10488758/…
Profi-Tipp: Es gibt nie wirklich einen guten Grund zum Laufensudo su
. Um einen Befehl als anderer Benutzer auszuführen, verwenden Sie sudo -u username command
. Wenn Sie eine Root-Shell möchten, führen Sie sudo -i
oder aus sudo -l
. Wenn Sie das Root-Konto aktiviert haben, können Sie es auch su
alleine ausführen , dies ist jedoch sudo su
nicht sinnvoll. Und ja, ich weiß, dass Sie es überall sehen.
Das heißt, sudo
hat den -E
Schalter, der die Umgebung der Benutzersitzung bewahrt:
-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.
Sie müssen also zuerst Ihre Variable exportieren und dann ausführen sudo -E
:
$ export DUMMY=dummy
$ sudo -Eu bob bash -c 'echo $DUMMY'
dummy
Das bash -c
wird nicht benötigt. Wenn ich es jedoch ausführe sudo -Eu bob echo "$DUMMY"
, wird die Variable erweitert, bevor die Root-Shell gestartet wird, sodass nicht gezeigt wird, dass der Befehl tatsächlich funktioniert:
$ 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 hinzuzufügen sudoers
. Vielleicht so: Defaults env_keep += "DUMMY"
.
sudo
. Es ist auch umständlicher für eine einzelne Variable. Das ist nur für etwas sinnvoll, das immer exportiert werden soll.
LD_PRELOAD
und Übertragen LESSCHARDEF
. Ich denke nicht, dass Bequemlichkeit hier das entscheidende Argument sein sollte ...
-E macht den Job für mich. Vom Menschen sudo
-
-E
, Weist auf die Sicherheitsrichtlinie hin, dass der Benutzer seine vorhandenen Umgebungsvariablen beibehalten möchte. Die Sicherheitsrichtlinie kann einen Fehler zurückgeben, wenn der Benutzer keine Berechtigung zum Schützen der Umgebung hat.--preserve-env
Es folgt eine Lösung, bei der die Sicherheitsrichtlinie nicht geändert werden muss.
Ich werde den su
Teil ignorieren , da wir die --user
Option von verwenden können sudo
.
Wir wollen Umgebungsvariablen über an einen command
Lauf übergeben sudo
. Die sudo
Übergabe von Umgebungsvariablen an einen Befehl ist jedoch nicht zulässig (es gibt gültige Sicherheitsgründe, einige Variablen können gefährlich sein). Mit einer Shell können Umgebungsvariablen festgelegt und sudo
eine Shell mit einem übergebenen Skript ausgeführt werden. Weisen Sie daher sudo
an, ein Skript auszuführen, das die Umgebungsvariablen festlegt.
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
?