나는 루트로서
# 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가 수행하는 모든 추가 작업을 건너뜁니다.)