sudo su에 환경 변수를 전달하는 방법


답변:


39

로그인 쉘을 호출하지 않고 할 수 있습니다 :

sudo DUMMY=dummy su ec2-user -c 'echo "$DUMMY"'

또는:

sudo DUMMY=dummy su -p - ec2-user -c 'echo "$DUMMY"'

-p의 옵션 su명령은 환경 변수를 보존 할 수 있습니다.


3
"-E"는 환경 변수 sudo.ws/man/sudo.man.html을
Andy

1
@Andy 그러나 sudo 구성에 의해 종종 금지됩니다.
Gilles 'SO- 악 그만

@cuonglm-감사합니다. 작동합니다. 로그인 쉘을 호출해서는 안됩니다.
Umang

1
@kenorb : 아니오, 이 경우가 아닌의 -p옵션입니다susudo
cuonglm

-m변수를 유지하는 다른 스레드가 있으며 다른 스레드 -c에는 차이점이 무엇입니까? 그리고이 답변 일에 대한 의견 중 하나 -E stackoverflow.com/questions/10488758/…
Vishrant

49

전문가 팁 : 실제로 실행할만한 이유는 없습니다sudo su . 다른 사용자로 명령을 실행하려면을 사용하십시오 sudo -u username command. 루트 쉘을 원하면 sudo -i또는을 실행하십시오 sudo -l. 루트 계정을 활성화 한 경우 su단독으로 실행할 수도 있지만 sudo su유용하지는 않습니다. 네, 어디서나 볼 수 있습니다.

즉, 사용자 세션의 환경을 보존 sudo하는 -E스위치가 있습니다.

 -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.

따라서 먼저 변수를 내보내고 다음을 실행해야합니다 sudo -E.

$ export DUMMY=dummy
$ sudo -Eu bob bash -c 'echo $DUMMY'
dummy

bash -c필요하지 않습니다. 그러나 내가 실행 sudo -Eu bob echo "$DUMMY"하면 루트 셸이 시작되기 전에 변수가 확장되므로 명령이 실제로 작동한다는 것을 보여주지 않습니다.

$ sudo -u bob echo $DUMMY  ## looks like it works but doesn't
dummy
$ sudo -u bob bash -c 'echo D:$DUMMY' ## now we see it failed
D:
$ sudo -Eu bob bash -c 'echo D:$DUMMY'  ## works as expected
D:dummy

2
환경 변수를 보존하는 더 좋은 방법은에 환경 변수를 추가하는 것 env_keep입니다 sudoers. 아마도 다음과 같습니다 Defaults env_keep += "DUMMY"..
lcd047

@ lcd047이지만 모든 호출에 대한 환경을 보존합니다 sudo. 단일 변수에는 더 번거 롭습니다. 항상 내 보내야 할 대상에만 유용합니다.
terdon

그렇습니다. 트레이드 오프이지만 모든 환경 변수가 똑같이 해로운 것은 아닙니다. 이월 LD_PRELOAD과 이월 에는 상당한 차이가 LESSCHARDEF있습니다. 나는 편의가이기는 논쟁이라고 생각하지 않는다 ...
lcd047

1
@ lcd047 귀하의 제안은 확실히 답변으로 게시 할 가치가 있습니다. 내 요점은 임의의 변수를 내보내는 것이 실용적이지 않다는 것입니다. 그렇습니다. 항상 내보내려는 특정 변수가있는 경우, 동일한 세션에 정의 된 변수에 대해 한 번만 수행하려는 경우가 아닙니다.
terdon

7

-E는 나를 위해 일을한다. 남자로부터 sudo-

-E, --preserve-env
사용자가 기존 환경 변수를 유지하려는 보안 정책을 나타냅니다. 사용자에게 환경을 보존 할 권한이 없으면 보안 정책에서 오류를 반환 할 수 있습니다.


불행히도 관리자가 -E 사용을 제한하지 않은 경우에만 작업을 수행합니다.
TorstenS

0

다음은 보안 정책을 변경하기 위해 필요하지 않은 솔루션입니다.

옵션을 su사용할 수 있으므로 부분 을 무시합니다.--usersudo .

환경 변수를을 통해 command실행 에 전달하려고합니다 sudo. 그러나 sudo환경 변수를 명령에 전달할 수는 없습니다 (유효한 보안 이유가 있으며 일부 변수는 위험 할 수 있습니다). 쉘은 환경 변수를 설정하는 데 사용될 수 있으며 sudo스크립트가 전달 된 상태에서 쉘을 실행할 수 있습니다. 따라서 sudo환경 변수를 설정하는 스크립트를 실행하도록 지시하십시오.

var_a=someThing
var_b=someOtherThing

sudo bash -c "
    export var_a=\"${var_a}\"
    export var_b=\"${var_b}\"

    the_command some_args
"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.