su - username -c "command"
위와 같이 명령어를 사용하거나 스크립트 내에서 동작하는 경우 스위치 하는 유저에 설정 된 환경 변수를 불러오지 못하는 알 수 없는 상황이 발생할 수 있습니다. 해당 문제에 대해 아래와 같은 내용의 경우 발생할 수 있으며 스크립트 작성 시 예외처리를 한다면 좋을 것 같습니다.
현상
junsuyoun@ad8772d8134e ~]$ cat .bash_profile
... 생략 ...
PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH
export JUN="test shell profile"
현상 재현을 위해 스위치 유저 명령을 수행할 유저에 JUN 변수를 선언 합니다.
[root@ad8772d8134e ~]# su - junsuyoun -c "env"
... 생략 ...
SHELL=/bin/bash
USER=junsuyoun
... 생략 ...
JUN=test shell profile
... 생략 ...
정상: root 유저에서 스위치 유저 env 명령을 수행할 경우 JUN 변수가 정상적으로 출력 되는것을 확인할 수 있습니다.
[root@ad8772d8134e ~]# su - junsuyoun -c "env"
... 생략 ...
SHELL=/bin/ksh
TERM=xterm
USER=junsuyoun
... 생략 ...
오류: root 유저에서 스위치 유저로 env 명령어 수행할 경우 JUN 변수가 보이지 않습니다.
분석
[root@ad8772d8134e ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
#junsuyoun:x:1007:1007::/home/junsuyoun:/bin/bash
junsuyoun:x:1007:1007::/home/junsuyoun:/bin/ksh
위의 오류가 발생한 것은 쉘 환경이 변경 되면서 나타나는 증상인데요. 일반적으로 bash 쉘 환경은 $HOME/.bash_profile이나 $HOME/.bashrc 를 가지고 변수 선언이 됩니다. ksh 쉘 환경은 $HOME/.profile 파일을 가지고 변수 선언 됩니다.
$ cat $HOME/.profile
export JUN="test shell profile"
junsuyoun 유저에 $HOME/.profile에 JUN 변수를 넣고 스위치 유저 명령을 수행해보겠습니다.
[root@ad8772d8134e ~]# su - junsuyoun -c "env"
... 생략 ...
JUN=test shell profile
LOGNAME=junsuyoun
PWD=/home/junsuyoun
SHELL=/bin/ksh
... 생략 ...
쉘 환경이 바뀜에도 정상적으로 출력되는 것으로 확인 됩니다.
해결
bash 쉘 환경이라 판단하고 su - junsuyoun -c "env" 하였지만 지정한 변수가 출력되지 않는다면 /etc/passwd의 유저 쉘 환경을 체크해보면 해당 문제를 잡을 수 있습니다.
sh / ksh / csh => $HOME/.profile
bash => $HOME/.bash_profile or $HOME/.bashrc