jak przekazać zmienną środowiskową do sudo su

Odpowiedzi:

39

Możesz to zrobić bez wywoływania powłoki logowania:

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

lub:

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

-pOpcja supolecenia zachowania zmiennych środowiskowych.

Cuonglm
źródło
3
Myślę, że „-E” zachowuje zmienne środowiskowe sudo.ws/man/sudo.man.html
Andy
1
@Andy Ale konfiguracja sudo często tego zabrania.
Gilles „SO- przestań być zły”
@cuonglm - dzięki. To działa. Nie powinienem był wywoływać powłoki logowania.
Umang,
1
@kenorb: Nie, -pjest opcją su, nie sudow tym przypadku
cuonglm
Istnieją inne wątki, które mówią, że -mzachowuje zmienną, inne mówią, jaka -cjest różnica? I jeden z komentarzy w tych dniach odpowiedzi -E stackoverflow.com/questions/10488758/…
Vishrant
49

Wskazówka: nigdy nie ma dobrego powodu, aby biegaćsudo su . Aby uruchomić polecenie jako inny użytkownik, użyj sudo -u username command. Jeśli chcesz powłoki roota, uruchom sudo -ilub sudo -l. Jeśli aktywowałeś konto root, możesz również uruchomić susam, ale sudo suto po prostu nie jest przydatne. I tak, wiem, że widzisz to wszędzie.

To powiedziawszy, sudoma -Eprzełącznik, który zachowa środowisko sesji użytkownika:

 -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.

Najpierw musisz wyeksportować zmienną, a następnie uruchomić sudo -E:

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

To bash -cnie jest potrzebne. Jednak jeśli uruchomię sudo -Eu bob echo "$DUMMY", zmienna zostanie rozwinięta przed uruchomieniem powłoki root, więc nie pokazuje, że polecenie faktycznie działa:

$ 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
źródło
2
Lepszym sposobem na zachowanie zmiennej środowiskowej jest dodanie jej do env_keepw sudoers. Być może słuszne: Defaults env_keep += "DUMMY".
lcd047
@ lcd047, ale pozwoli to zachować środowisko dla wszystkich wywołań sudo. Jest to również bardziej kłopotliwe dla pojedynczej zmiennej. Jest to przydatne tylko w przypadku czegoś, co zawsze powinno być eksportowane.
terdon
Tak, jest to kompromis, ale nie wszystkie zmienne środowiskowe są równie szkodliwe. Istnieje zasadnicza różnica między przeniesieniem LD_PRELOADa przeniesieniem LESSCHARDEF. Nie sądzę, żeby wygrana była wygraną ...
lcd047
1
@ lcd047 Twoja sugestia jest z pewnością warta opublikowania jako odpowiedź. Chodzi mi o to, że eksportowanie dowolnych zmiennych nie jest praktyczne. Tak, jeśli istnieje konkretna zmienna, którą zawsze chcesz wyeksportować, jest to odpowiedni sposób, ale nie, jeśli chcesz to zrobić raz i dla zmiennej zdefiniowanej w tej samej sesji.
terdon
7

-E wykonuje za mnie pracę. Od człowieka sudo-

-E, Wskazuje na politykę bezpieczeństwa, która życzenia użytkownika do pre- służyć istniejących zmiennych środowiskowych. Polityka bezpieczeństwa może zwrócić błąd, jeśli użytkownik nie ma uprawnień do ochrony środowiska.--preserve-env

Amit Jha
źródło
Niestety wykona to zadanie tylko wtedy, gdy administrator nie ograniczy cię do używania opcji -E.
TorstenS,
0

Poniżej znajduje się rozwiązanie, które nie wymaga zmiany polityki bezpieczeństwa.

Zignoruję tę suczęść, ponieważ możemy skorzystać z --useropcji sudo.

Chcemy przekazać zmienne środowiskowe do commanduruchomienia sudo. Nie sudozezwala jednak na przekazywanie zmiennych środowiskowych do komendy (istnieje uzasadniony powód bezpieczeństwa, niektóre zmienne mogą być niebezpieczne). Powłoki można używać do ustawiania zmiennych środowiskowych i sudomożna uruchomić powłokę z przekazanym do niej skryptem. Dlatego każ sudouruchomić skrypt, który ustawia zmienne środowiskowe.

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
źródło