다른 사용자로 명령을 실행할 때 환경 변수를 전달하는 방법은 무엇입니까?

다른 사용자로 명령을 실행할 때 환경 변수를 전달하는 방법은 무엇입니까?

나는 루트로서

# WWWFOLDER=myproject
# echo $WWWFOLDER
myproject
# su - anothershelluser /bin/bash -c "echo $WWWFOLDER"

#

보시다시피 저는 아무것도 인쇄하지 않습니다.

나는 시도했지만 성공하지 못했습니다.

# su - anothershelluser /bin/bash -c "echo ${WWWFOLDER}"

# su - anothershelluser /bin/bash -c 'echo ${WWWFOLDER}'

# su - anothershelluser /bin/bash -c 'echo $WWWFOLDER'

질문

실행될 bash 명령에 WWWFOLDER를 어떻게 전달합니까?

답변1

전달하는 -것은 su환경을 지우고 로그인을 시뮬레이션하도록 명시적으로 요청하는 것입니다.

그냥 놔두세요 -.

또한 대부분의 su구현에서는 대상 사용자의 로그인 셸에 코드를 전달하므로 -c해당 셸 구문의 코드를 전달해야 합니다. 해당 쉘이 Bourne과 유사한 경우:

# export VAR=value
# su anothershelluser -c 'printf "%s\n" "$VAR"'
value

대상 사용자의 로그인 셸과 관계없이 bash 셸을 실행해야 하는 경우(왜 그렇게 하려는가) 대상 사용자의 로그인 셸 구문을 사용하여 해당 bash 셸을 실행하도록 코드를 구성해야 합니다.

The Bourne Supremacy와 같다면 다음과 같을 것입니다.

su anothershelluser -c 'exec bash -c '\''printf "%s\n" "$VAR"'\'

sudo대신 사용하는 것이 su더 쉬울 것입니다 .

sudo -E -u anothershelluser bash -c 'printf "%s\n" "$VAR"'

( -E환경을 보호하기 위해 sudo반드시 환경을 보호하는 것은 아닙니다 .모두환경).

zsh 쉘에는 UID, EUID, GID, EGID 또는 USERNAME 변수를 할당하여 uid/gids 변경을 지원하는 기능이 내장되어 있습니다. 문제는 다음과 같습니다.

(USERNAME=anothershelluser; bash -c 'printf "%s\n" "$VAR"')

(또한 pam 스택 호출, 로깅, 추가 pty 래퍼 추가 등과 같이 su/sudo가 수행하는 모든 추가 작업을 건너뜁니다.)

관련 정보