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.
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.
Odpowiedzi:
Najpierw musisz export HTTP_PROXY
. Po drugie, musisz man sudo
uważnie przeczytać i zwrócić uwagę na -E
flagę. To działa:
$ export HTTP_PROXY=foof
$ sudo -E bash -c 'echo $HTTP_PROXY'
Oto cytat ze strony podręcznika:
-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.
LC_*
zmienną. Więc po prostu zrób export LOL_FOO=$LC_FOO
i użyj LOL_FOO
zamiast tego.
PATH
w .bashrc
pliku - na przykład export PATH=myPath:$PATH
. Jeśli piszę sudo -E bash -c 'echo $PATH'
, to PATH
prawdopodobnie nie zawiera myPath, ponieważ sudo
już wcześniej wyłączył lokalną wartość PATH
przed wywołaniem bash
. 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:
Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"
zaczerpnięte z ArchLinux wiki .
W przypadku Ubuntu 14 musisz określić w osobnych wierszach, ponieważ zwraca błędy dla linii o wielu zmiennych:
Defaults env_keep += "http_proxy"
Defaults env_keep += "https_proxy"
Defaults env_keep += "HTTP_PROXY"
Defaults env_keep += "HTTPS_PROXY"
sudo -E
to pewny sposób, aby adhoc uzyskać ten sam efekt jednorazowy
etc/sudoers
bezpośrednio. Zamiast tego użyj visudo
polecenia, które sprawdza składnię twoich zmian przed nadpisaniem sudoers
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.
sudo http_proxy=$http_proxy wget "http://stackoverflow.com"
package
podstawie dodanego do jakiegoś mojasciezka PATH
w .bashrc
pliku (z export
clausule). Następnie sudo PATH=$PATH which package
znajduje właściwą odpowiedź, w przeciwieństwie do sudo which package
. Nie sudo PATH=$PATH package
wykracza jednak poza sudo package
(nie znaleziono pliku). Z drugiej strony wystrzeliwanie równiny package
z przywołanej powłoki sudo bash
zachowuje przedłużoną ścieżkę i daje package
prawa sudo (dwa gołębie z jednym kamieniem). Odpowiedź naprawdę zależy od tego, które polecenia uruchamiasz
Moż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"
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 przypadku#!/bin/bash
function sudo_exports(){
eval sudo $(for x in $_EXPORTS; do printf '%q=%q ' "$x" "${!x}"; done;) "$@"
}
# create a test script to call as sudo
echo 'echo Forty-Two is $VAR42' > sudo_test.sh
chmod +x sudo_test.sh
export VAR42="The Answer to the Ultimate Question of Life, The Universe, and Everything."
export _EXPORTS="_EXPORTS VAR1 VAR2 VAR3 VAR4 VAR5 VAR6 VAR7 VAR8 VAR9 VAR10 VAR11 VAR12 VAR13 VAR14 VAR15 VAR16 VAR17 VAR18 VAR19 VAR20 VAR21 VAR22 VAR23 VAR24 VAR25 VAR26 VAR27 VAR28 VAR29 VAR30 VAR31 VAR32 VAR33 VAR34 VAR35 VAR36 VAR37 VAR38 VAR39 VAR40 VAR41 VAR42"
# clean function style
sudo_exports ./sudo_test.sh
# or just use the content of the function
eval sudo $(for x in $_EXPORTS; do printf '%q=%q ' "$x" "${!x}"; done;) ./sudo_test.sh
$ ./demo.sh
Forty-Two is The Answer to the Ultimate Question of Life, The Universe, and Everything.
Forty-Two is The Answer to the Ultimate Question of Life, The Universe, and Everything.
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
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.
# prepare a script e.g. for running maven
runmaven=/tmp/runmaven$$
# create the script with a here document
cat << EOF > $runmaven
#!/bin/bash
# run the maven clean with environment variables set
export ANT_HOME=/usr/share/ant
export MAKEFLAGS=-j4
mvn clean install
EOF
# make the script executable
chmod +x $runmaven
# run it
sudo $runmaven
# remove it or comment out to keep
rm $runmaven