쉘 스크립트에서 `$SUDO_USER` 환경 변수에 어떻게 액세스합니까?

쉘 스크립트에서 `$SUDO_USER` 환경 변수에 어떻게 액세스합니까?
  • $USER환경 $SHELL변수는/bin/zsh
  • 루트에 대한 내 $SHELL환경 변수는 다음과 같습니다./bin/bash

저는 Unix 쉘 스크립트를 로 실행하고 있습니다 sudo. 이 스크립트에서는 $SHELLenv 변수 $SUDO_USER/bin/zsh. 그러나 이 명령에서는 다음을 수행합니다.

if [ $SHELL != "/bin/zsh" ]; then
  pacman -S --needed --no-confirm zsh
  sudo -u $SUDO_USER chsh -s /usr/bin/zsh
fi

$SHELL실제로 루트의 환경은 가능합니다. 어떻게 가나 $SHELL$SUDO_USER?

감사해요.

편집하다 가장 좋은 방법은 $SHELL이 변수 ​​외에 다른 환경 변수를 갖는 것입니다.

답변1

옵션을 사용하여 환경을 호스팅합니다 -E, --preserve-env. sudo예를 들어 sudo -E ./test.sh.

어떠한 환경도 허용하는 것은 권장되지 않습니다. 보다명령 환경에 참여 man sudoers.

답변2

일반적으로 환경 $SHELL변수는 /etc/passwd사용자가 입력한 7번째 필드를 기준으로 설정되므로,$SUDO_USER기본shell에서 직접 찾아볼 수 있습니다.

if [ $(getent passwd $SUDO_USER | cut -d: -f 7) != "/bin/zsh" ]; then
  ...

그러나 명령이 실행된 정확한 쉘의 값을 원한다면 sudo상위 프로세스의 환경을 살펴봐야 합니다.

get_ppid() {
  ps -ho ppid -p "$1" | tr -d " "
}

SUDO_USERS_SHELLPID=$(get_ppid $( get_ppid $$ ))  # get the PID of this shell's grandparent

# if you want the actual pathname of the shell used as the grandparent process:
if [ $(readlink /proc/$SUDO_USERS_SHELLPID/exe) != "/bin/zsh" ]; then
  ...

# or if you want the $SHELL environment value from the grandparent process:
if [ $(strings /proc/$SUDO_USERS_SHELLPID/environ | awk -F= '/^SHELL=/{ print $2; }') != "/bin/zsh" ]; then
  ...

관련 정보