sudo와 함께 명령을 사용할 때 환경 변수가 없습니다. 예를 들어, HTTP_PROXY를 설정 한 후이 명령 wget
은없이 작동합니다 sudo
. 그러나 입력 sudo wget
하면 프록시 설정을 무시할 수 없습니다.
sudo와 함께 명령을 사용할 때 환경 변수가 없습니다. 예를 들어, HTTP_PROXY를 설정 한 후이 명령 wget
은없이 작동합니다 sudo
. 그러나 입력 sudo wget
하면 프록시 설정을 무시할 수 없습니다.
답변:
먼저해야합니다 export HTTP_PROXY
. 둘째, man sudo
주의 깊게 읽고 -E
깃발에 주의를 기울여야합니다 . 이것은 작동합니다 :
$ export HTTP_PROXY=foof
$ sudo -E bash -c 'echo $HTTP_PROXY'
맨 페이지의 인용문은 다음과 같습니다.
-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_*
변수 와 함께 작동하지 않습니다 . 그러니 그냥 이렇게 export LOL_FOO=$LC_FOO
하고 사용 LOL_FOO
하는 대신.
PATH
에 하나의 요소를 추가하는 간단한 경우에는 작동하지 않습니다 . 내가 입력하면 , 다음 있기 때문에 아마 MYPATH를 포함하지 않는 이미의 로컬 값을 사용할 수있다 호출하기 전에 . 오히려 stackoverflow.com/a/33183620/5459638 아래의 답변이 효과적이라는 것을 .bashrc
export PATH=myPath:$PATH
sudo -E bash -c 'echo $PATH'
PATH
sudo
PATH
bash
sudo PATH=$PATH command
비결은 명령을 sudoers
통해 파일 에 환경 변수를 sudo visudo
추가하고 다음 줄을 추가하는 것입니다.
Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"
ArchLinux 위키 에서 가져온 것입니다 .
Ubuntu 14의 경우 다중 변수 행에 대한 오류를 반환하므로 별도의 행으로 지정해야합니다.
Defaults env_keep += "http_proxy"
Defaults env_keep += "https_proxy"
Defaults env_keep += "HTTP_PROXY"
Defaults env_keep += "HTTPS_PROXY"
sudo -E
adhoc에 대한 확실한 방법은 일회성에 대해 동일한 효과를 얻을 수 있습니다.
etc/sudoers
. 대신, 파일을 visudo
덮어 쓰기 전에 편집 내용을 구문 검사 하는 명령을 사용 sudoers
하십시오. 그렇게하면 편집 중에 실수를하더라도 자신을 잠그지 않습니다.
개별 변수에 대해 하나씩 사용 가능하게하려면 명령의 일부로 만들 수 있습니다.
sudo http_proxy=$http_proxy wget "http://stackoverflow.com"
package
추가 일부 MYPATH에서 PATH
에 .bashrc
(와 파일 export
clausule). 그런 다음 sudo PATH=$PATH which package
과 달리 정답을 찾습니다 sudo which package
. 그러나 (파일을 찾을 수 없음) sudo PATH=$PATH package
이상으로 가지 sudo package
않습니다. 다른 한편으로, package
호출 sudo bash
된 껍질에서 평원 을 시작 하면 확장 된 경로 를 유지하고 package
sudo 권한을 부여합니다 (한 개의 돌을 가진 두 마리의 비둘기). 따라서 응답은 실제로 어떤 명령을 시작하는지에 따라 다릅니다.
나는 다음과 같은 이유로 독특한 솔루션을 생각해 냈습니다.
sudo -E "$@"
내 명령에 문제를 일으키는 변수가 누출되었습니다.sudo VAR1="$VAR1" ... VAR42="$VAR42" "$@"
내 경우에는 길고 못생긴#!/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.
이것은 bash 내장 기능으로 가능합니다 printf
. 는 %q
쉘 인용 문자열을 생성합니다. bash 4.4의 매개 변수 확장 과 달리 이것은 bash 버전 <4.0에서 작동합니다.
환경 변수를 스크립트에 보관해야 할 경우 여기에 문서에 명령을 넣을 수 있습니다. 특히 설정할 변수가 많으면 깔끔하게 보입니다.
# 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