새소식

Operation System/Unix & Linux

linux/unix su - username -c 사용 시 주의 사항

  • -
728x90
반응형
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


 

728x90
반응형

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.