So übergeben Sie eine Umgebungsvariable an sudo su


Antworten:


39

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 -pder suBefehlsoption werden Umgebungsvariablen beibehalten.


3
Ich denke, "-E" bewahrt Umgebungsvariablen sudo.ws/man/sudo.man.html
Andy

1
@ Andy Aber es ist oft durch die Sudo-Konfiguration verboten.
Gilles 'SO- hör auf böse zu sein'

@ Cuonglm - danke. Das funktioniert. Sollte die Login-Shell nicht aufgerufen haben.
Umang

1
@kenorb: Nein, -pist Option su, sudoin diesem Fall nicht
Cuonglm

Es gibt andere Threads, die besagen, dass -mdie Variable erhalten bleibt, andere besagen, -cwas ist der Unterschied? Und einer der Kommentare in dieser Antwort Tage -E stackoverflow.com/questions/10488758/…
Vishrant

49

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 -ioder aus sudo -l. Wenn Sie das Root-Konto aktiviert haben, können Sie es auch sualleine ausführen , dies ist jedoch sudo sunicht sinnvoll. Und ja, ich weiß, dass Sie es überall sehen.

Das heißt, sudohat den -ESchalter, 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 -cwird 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

2
Eine bessere Möglichkeit, eine Umgebungsvariable beizubehalten, besteht darin, sie zu env_keepin hinzuzufügen sudoers. Vielleicht so: Defaults env_keep += "DUMMY".
lcd047

@ lcd047 aber das schont die Umgebung für alle Aufrufe von sudo. Es ist auch umständlicher für eine einzelne Variable. Das ist nur für etwas sinnvoll, das immer exportiert werden soll.
terdon

Ja, es ist ein Kompromiss, aber nicht alle Umgebungsvariablen sind gleichermaßen schädlich. Es gibt einen wesentlichen Unterschied zwischen Übertragen LD_PRELOADund Übertragen LESSCHARDEF. Ich denke nicht, dass Bequemlichkeit hier das entscheidende Argument sein sollte ...
lcd047

1
@ lcd047 dein vorschlag ist auf jeden fall eine antwort wert. Mein Punkt ist, dass es nicht praktisch ist, um beliebige Variablen zu exportieren. Ja, wenn es eine bestimmte Variable gibt, die Sie immer exportieren möchten, ist dies der richtige Weg, aber nicht, wenn Sie dies einmal und für eine in derselben Sitzung definierte Variable tun möchten.
terdon

7

-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


Leider wird es nur funktionieren, wenn Ihr Administrator Sie nicht daran gehindert hat, -E zu verwenden.
TorstenS

0

Es folgt eine Lösung, bei der die Sicherheitsrichtlinie nicht geändert werden muss.

Ich werde den suTeil ignorieren , da wir die --userOption von verwenden können sudo.

Wir wollen Umgebungsvariablen über an einen commandLauf ü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 sudoeine Shell mit einem übergebenen Skript ausgeführt werden. Weisen Sie daher sudoan, 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
"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.