Kiedy używam dowolnego polecenia z sudo, nie ma tam zmiennych środowiskowych. Na przykład po ustawieniu HTTP_PROXY polecenie wget
działa bez niego sudo
. Jednak jeśli piszę sudo wget
, mówi, że nie może ominąć ustawienia proxy.
linux
environment-variables
sudo
Ahmed Aswani
źródło
źródło
Odpowiedzi:
Najpierw musisz
export HTTP_PROXY
. Po drugie, musiszman sudo
uważnie przeczytać i zwrócić uwagę na-E
flagę. To działa:Oto cytat ze strony podręcznika:
źródło
LC_*
zmienną. Więc po prostu zróbexport LOL_FOO=$LC_FOO
i użyjLOL_FOO
zamiast tego.PATH
w.bashrc
pliku - na przykładexport PATH=myPath:$PATH
. Jeśli piszęsudo -E bash -c 'echo $PATH'
, toPATH
prawdopodobnie nie zawiera myPath, ponieważsudo
już wcześniej wyłączył lokalną wartośćPATH
przed wywołaniembash
. Zamiast tego znalazłem odpowiedź poniżej stackoverflow.com/a/33183620/5459638 skuteczną, to znaczysudo PATH=$PATH command
Sztuką jest dodanie zmiennych środowiskowych do
sudoers
pliku za pomocąsudo visudo
polecenia i dodanie następujących wierszy:zaczerpnięte z ArchLinux wiki .
W przypadku Ubuntu 14 musisz określić w osobnych wierszach, ponieważ zwraca błędy dla linii o wielu zmiennych:
źródło
sudo -E
to pewny sposób, aby adhoc uzyskać ten sam efekt jednorazowyetc/sudoers
bezpośrednio. Zamiast tego użyjvisudo
polecenia, które sprawdza składnię twoich zmian przed nadpisaniemsudoers
pliku. W ten sposób nie blokujesz się, jeśli popełnisz błąd podczas edycji.W przypadku poszczególnych zmiennych, które chcesz udostępnić jednorazowo, możesz włączyć je do polecenia.
źródło
package
podstawie dodanego do jakiegoś mojasciezkaPATH
w.bashrc
pliku (zexport
clausule). Następniesudo PATH=$PATH which package
znajduje właściwą odpowiedź, w przeciwieństwie dosudo which package
. Niesudo PATH=$PATH package
wykracza jednak pozasudo package
(nie znaleziono pliku). Z drugiej strony wystrzeliwanie równinypackage
z przywołanej powłokisudo bash
zachowuje przedłużoną ścieżkę i dajepackage
prawa sudo (dwa gołębie z jednym kamieniem). Odpowiedź naprawdę zależy od tego, które polecenia uruchamiaszMożesz także połączyć dwa
env_keep
stwierdzenia w odpowiedzi Ahmeda Aswani w jedno zdanie takie jak to:Defaults env_keep += "http_proxy https_proxy"
Należy również rozważyć podanie
env_keep
tylko jednego polecenia takiego jak to:Defaults!/bin/[your_command] env_keep += "http_proxy https_proxy"
źródło
Prosta funkcja opakowania (lub wbudowana pętla)
Wymyśliłem unikalne rozwiązanie, ponieważ:
sudo -E "$@"
wyciekły zmienne, które powodowały problemy dla mojej komendysudo VAR1="$VAR1" ... VAR42="$VAR42" "$@"
był długi i brzydki w moim przypadkudemo.sh
Wynik
W jaki sposób?
Jest to możliwe dzięki wbudowanej funkcji bash
printf
.%q
Tworzy powłoki cytowany łańcuch. W przeciwieństwie do rozszerzenia parametrów w bash 4.4 , działa to w wersjach bash <4.0źródło
Jeśli potrzebujesz zachować zmienne środowiskowe w skrypcie, możesz umieścić swoje polecenie w dokumencie tutaj takim jak ten. Zwłaszcza jeśli masz wiele zmiennych, dzięki którym rzeczy wyglądają schludnie.
źródło