Jak wyeksportować zmienną do użycia z sudo?

24

Na Slackware użycie sbopkgpozwala zbudować pakiet ze źródła. Repos nie jest duży jak Debian, ale jest fajny.

Niektóre oprogramowanie może wykorzystywać zmienne środowiskowe, na przykład na emulatorze VICE c64, jeśli zmienna FFMPEGjest ustawiona na yes, umożliwia ffmpegrejestrowanie emulatora.

Próbowałem użyć

$ export FFMPEG=yes; sudo sbopkg -B -i vice

ale ffmpegjest wyłączone.

Zamiast tego musiałem użyć

$ su -
$ export FFMPEG=yes
$ sbopkg -B -i vice

który działa.

Jak używać zmiennych środowiskowych sudo?

Elbarna
źródło

Odpowiedzi:

39

Możesz skorzystać z -Eopcji sudo :

FMPEG=yes sudo -E sbopkg -B -i vice

Z instrukcji:

-E, --preserve-env

Wskazuje w polityce bezpieczeństwa, że ​​użytkownik chce zachować istniejące zmienne środowiskowe. Polityka bezpieczeństwa może zwrócić błąd, jeśli użytkownik nie ma uprawnień do ochrony środowiska.

Zauważ, że to eksportuje wszystkie istniejące zmienne środowiskowe. Bezpieczniej jest eksportować tylko potrzebne zmienne środowiskowe, stosując następującą składnię :

sudo FMPEG=yes sbopkg -B -i vice

Xhienne
źródło
Dzięki, ale to nie działa (opcja.-E) druga linia jest w porządku, ponieważ pierwszą odpowiedź wybieram jako poprawną.
elbarna
11

sudodezynfekuje zmienne w środowisku przed wywołaniem danego polecenia. Będziesz musiał poprosić go o zachowanie zmiennych w środowisku, aby twoje polecenie działało.

Dodatkowo, trzeba będzie exportw FMPEGzmiennej przed użyciem sudo( export FMPEG=yes; sudo), przypisać go w tej samej podróży, jak wywoływanie sudo( FMPEG=yes sudo) lub zastosowanie env( env FMPEG=yes sudo).

Aby zachować zmienne środowiskowe, użyj -E(lub --preserve-env):

$ env FMPEG=yes sudo -E sbopkg -B -i vice

Możliwe jest również ustawienie określonych zmiennych środowiskowych, takich jak to:

$ sudo FMPEG=yes sbopkg -B -i vice

Jeśli to się nie powiedzie ze względu na obowiązującą politykę bezpieczeństwa, uruchom powłokę root i ustaw tam zmienną:

$ sudo -s
# env FMPEG=yes sbopkg -B -i vice
# exit
Kusalananda
źródło
6

zwróć uwagę, że: (export a=b; command)jest równoważne z a=b command. Zwróć uwagę na nawiasy.

Jeśli zastosujemy zmienną nie do, sudoale bezpośrednio do sbopkg, zamiast tego FFMPEG=yes sudo sbopkg -B -i vice możemy to zrobić sudo FFMPEG=yes sbopkg -B -i vice

Jeśli policja bezpieczeństwa temu zapobiegnie, wówczas: sudo bash -c "FFMPEG=yes sbopkg -B -i vice"

(Nie używaj -E, jest to niepewne, ponieważ wycieknie nieoczekiwane zmienne).

ctrl-alt-delor
źródło