Zasadniczo muszę to zrobić:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
To nie działa Jak mogę przekazać zmienną env $ DUMMY do su? -p nie działa z -l.
Zasadniczo muszę to zrobić:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
To nie działa Jak mogę przekazać zmienną env $ DUMMY do su? -p nie działa z -l.
Odpowiedzi:
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"'
-p
Opcja su
polecenia zachowania zmiennych środowiskowych.
-p
jest opcją su
, nie sudo
w tym przypadku
-m
zachowuje zmienną, inne mówią, jaka -c
jest różnica? I jeden z komentarzy w tych dniach odpowiedzi -E
stackoverflow.com/questions/10488758/…
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 -i
lub sudo -l
. Jeśli aktywowałeś konto root, możesz również uruchomić su
sam, ale sudo su
to po prostu nie jest przydatne. I tak, wiem, że widzisz to wszędzie.
To powiedziawszy, sudo
ma -E
przełą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 -c
nie 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
env_keep
w sudoers
. Być może słuszne: Defaults env_keep += "DUMMY"
.
sudo
. Jest to również bardziej kłopotliwe dla pojedynczej zmiennej. Jest to przydatne tylko w przypadku czegoś, co zawsze powinno być eksportowane.
LD_PRELOAD
a przeniesieniem LESSCHARDEF
. Nie sądzę, żeby wygrana była wygraną ...
-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
Poniżej znajduje się rozwiązanie, które nie wymaga zmiany polityki bezpieczeństwa.
Zignoruję tę su
część, ponieważ możemy skorzystać z --user
opcji sudo
.
Chcemy przekazać zmienne środowiskowe do command
uruchomienia sudo
. Nie sudo
zezwala 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 sudo
można uruchomić powłokę z przekazanym do niej skryptem. Dlatego każ sudo
uruchomić 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
"
sudo -iu ec2-user echo $DUMMY
?