'sudo'로 실행할 때 환경 변수


48

내 질문에 대한 예로서 내 ~/.bashrc파일에는 다음 줄이 포함되어 있습니다.

export LD_LIBRARY_PATH=/opt/intel/mkl/lib/ia32:$LD_LIBRARY_PATH
export LD_PRELOAD=/opt/intel/mkl/lib/ia32/libmkl_core.so

Numpy (Python)는 MKL 및 Intel 컴파일러로 빌드되므로 실행 해야하는 라이브러리를 찾을 수 있습니다. 이 워크 플로우는 최고는 아니지만 또 다른 이야기입니다.

내 질문은 'sudo'로 프로그램을 실행할 때 (루트가 아닌) 임의의 변수를 전달하는 방법은 ~/.bashrc무엇입니까?

현재 내가 실행하면 :

sudo python -c "import numpy"

오류가 발생합니다.

ImportError: libimf.so: cannot open shared object file: No such file or directory*

여기서 제안 sudo -i하거나 sudo -E변경하지 않는 제안이 있습니다.


편집하다:

나는 내 질문 (충분하지 않은 점 : D)에 대답 할 수 없지만 sudo함정 에 대해 궁금해하는 다른 Linux 초보자가 있기를 바랍니다 .

[일시적으로 만!] 이것은 나를 위해 작동합니다 ( ~/.bashrc) :

alias sudo='sudo env PATH=$PATH VAR1=SOME_VALUE VAR2=SOME_VALUE...'

답변:


57

환경 변수는 sudoENV = VALUE 형식 으로 간단히 전달 될 수 있으며 그 뒤에 따르는 명령이 허용됩니다. 이 사용법에 제한이 있는지는 알려지지 않았으므로 예제 문제를 해결할 수 있습니다.

sudo LD_LIBRARY_PATH=/opt/intel/mkl/lib/ia32:$LD_LIBRARY_PATH LD_PRELOAD=/opt/intel/mkl/lib/ia32/libmkl_core.so python -c "import numpy"


아직도 오늘 이것은 내 RPi 3의 Raspbian Jessy에서 나를 위해 일했습니다 ... 거의 일주일이 지나면 스크립트가 시작되지 않았습니까? 고마워요!
DarkCygnus

21

-E언급 한 옵션은 제대로 작동하는 것 같습니다.

enzotib@host:~$ export DUMMY=dummy
enzotib@host:~$ sudo -E sh -c 'echo $DUMMY'
dummy
enzotib@host:~$ sudo -E env | grep DUMMY
DUMMY=dummy

죄송하지만 귀하의 답변을 이해하지 못합니다. 위에 게시 한 시나리오에 대한 예를 제공 할 수 있습니까? 즉 실행할 수 있도록 sudo python -c "import numpy"함께 LD_LIBRARY_PATH하고 LD_PRELOAD위의 기록으로 정의?
제타

2
@zetah : ok, 나는 잘못되었습니다. 일반 페이지에서는 작동하지만 매뉴얼 페이지 섹션 SECURITY NOTES에 설명 된 것처럼 제어 변수를 제어하는 ​​동적 링크에는 작동하지 않기 때문 sudo입니다.
enzotib

(제공된 답변에서와 같이) 더 man sudo명확하지는 않지만 사용자가 거기에서 지적한 참조를 따르려고 할 때 따라야 할 모든 분기에 의해 낙담하기가 매우 쉽습니다. 의미.
제타

14

-Esudo 옵션을 사용 하여 현재 환경을 보존 할 수 있습니다 (권한이있는 경우).

$ man sudo
 -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.

8

당신은 당신을 편집 할 필요 sudoerssudo visudo같은 가능성이 당신이 당신의 우선 사용 가능 보안 정책 플러그인했습니다 PATH에서 secure_path옵션을 선택합니다. 따라서 목록에 경로를 추가하면 다음과 같이 env_keep대신 사용할 수도 있습니다 .

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"

PATH재정의 되었는지 확인하려면 다음 명령을 실행하십시오.

$ sudo sudo -V | grep PATH
Value to override user's $PATH with: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

또한 sudo와 su를 통해 실행할 때 PATH 변수가 다른 이유는 무엇입니까? 유닉스 SE에서


+1이지만 env_keepPATH에서 작동하지 않습니다 ( 명령을 찾을 때 sudo여전히 사용 한다는 의미에서 secure_path)
Zanna

0

이것은 나를 위해 작동합니다 ( ~/.bashrc) :

alias sudo='sudo env PATH=$PATH VAR1=SOME_VALUE VAR2=SOME_VALUE...'

출처 : OP 편집 기준


1
이것은 효과가 있지만 sudo덜 안전 하기 때문에 나쁜 생각입니다
Zanna
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.