본문 바로가기

IT

[Ubuntu/Linux] su와 su - 차이점을 정리해보기

사용자 계정으로 로그인한 후

간혹 관리자 root 권한이 필요할 때가 있습니다.


패키지를 설치하거나,

시스템 설정 파일을 수정하거나,

신규유저를 추가하거나,

다른 계정으로 파일권한을 변경하거나

root 권한을 광범위하게 사용하고 있습니다.


root 권한으로 변경할 때 가장 친숙한 명령어가 su입니다.



su는 substitute user의 줄임말입니다.

현 사용자를 로그아웃하지 않고, 다른 사용자의 권한을 획득할 때 사용하죠.

단일 사용자계정으로 우분투 데스크탑을 사용하고 있는 경우에도,

사용자의 권한을 루트로 변경할때 자주 사용합니다.


사용법 : su [변경하고자 하는 사용자 ID]


su 뒤에 변경할 사용자 ID를 입력하지 않는다면,

su root와 동일하게 동작합니다.


$ su
Password: 
# exit
logout
$


위처럼 일반계정쉘 $이 보이다가,

su root로 변경된 후 관리자계정쉘 #로 변경되는 것을 볼 수 있습니다.


하지만 su 뒤에 -를 붙이면 동작방식이 달라집니다.

‘-’의 의미는 무엇일까요?


‘-’

‘-l’

‘--login’

Make the shell a login shell. This means the following. Unset all environment variables except TERM, HOME, and SHELL (which are set as described above), and USER and LOGNAME (which are set, even for the super-user, as described above), and set PATH to a compiled-in default value. Change to user's home directory. Prepend ‘-’ to the shell's name, intended to make it read its login startup file(s). 


‘-’는 -l 혹은 --login과 동일한 명령어입니다.

곧, su -는 su --login root와 동일한 명령인 셈입니다.

위의 설명에서 언급되어 있듯,

‘-’의 유무는 환경변수와 워킹디렉토리에 영향을 줍니다.



위의 표를 하나씩 살펴보기로 하죠.

환경변수 TERM, HOME, SHELL, USER, LOGNAME는,

su나 su -나 모두 변경된 사용자 ID에 맞게 재설정됩니다.


HOME과 SHELL은  /etc/passwd에서 변경할 사용자의 정보를 가져와서 설정합니다.

USER와 LOGNAME은 변경할 사용자계정을 입력하지요.


PATH는 su에선 변경 전후가 동일하지만,

su -에선 PATH가 컴파일시 설정한 default 값으로 설정됩니다.


그 외의 환경변수는 분명한 차이가 있죠.

su는 기존 사용자 환경에서 설정된 환경변수를 그냥 그대로 유지합니다.

그에 반해, su -는 기존 사용자 환경에서 사용하던 환경변수를 모두 지워버립니다.


$ export hello=tizen
$ su
암호:  # echo $hello tizen # exit $ su - # echo $hello (null)

위의 예를 살펴보시죠.

기존 사용자 계정에서 hello라는 변수에 tizen이라는 값을 넣어두었습니다.

그리고 su로 관리자 계정으로 변경합니다.

su는 기타 환경변수를 유지하기 때문에 hello의 환경변수값이 tizen으로 나오겠지요?

위의 예에서도 echo $hello를 하니 tizen이 나오네요.


그리고 exit하여 원래 계정으로 복귀한 후,

이번엔 su -를 합니다.

그리고 echo $hello를 해봅니다.

이번에는 아무 것도 나오지 않네요.

--login 옵션으로 환경변수가 정리되었기 때문입니다.


그리고, su는 워킹디렉토리를 변경하지 않습니다.

반면 su -는 변경한 사용자 계정의 홈디렉토리로 이동하게 됩니다.


$ pwd
/tmp
$ su
암호: 
# pwd
/tmp
# exit
exit
$ su -
암호: 
# pwd
/root


최초에 /tmp 디렉토리에 있었고,

su를 해도 여전히 /tmp에 머물고 있습니다.

하지만, su -를 하면, 관리자 계정의 홈디렉토리인 /root로 이동하게 됩니다


위의 차이점을 알고 사용하면 됩니다.

워킹디렉토리는 cd로 변경하면 그만이니,

환경변수 설정부분만 유의하면 되겠네요.

환경변수는 빌드/실행에 영향을 줄 수 있으니까요.


끝_



* References

http://ko.wikipedia.org/wiki/Su_%28%EC%9C%A0%EB%8B%89%EC%8A%A4%29

http://www.gnu.org/software/coreutils/manual/html_node/su-invocation.html