리눅스 su - user와 su user의 차이
- 운영체제(OS)
- 2023. 6. 15.
리눅스에서 계정을 전환할 때 su (switch user) 명령어를 사용합니다. user라는 계정으로 전환할 때 사용 패턴은 크게 두 가지로 나뉠 것입니다. su - user 또는 su user입니다. 결과는 언뜻 같아 보입니다. - 옵션을 사용하던 안 하던 계정 전환은 문제없이 되기 때문입니다. 그러나 알고 보면 둘은 큰 차이가 있습니다.
su -와 su 차이
su - user
su - user은 user라는 사용자로 로그인하고 그 사용자의 환경을 로드하는 것을 의미합니다. 핵심은 두 가지입니다. 1) 로그인했다는 것과 2) 해당 사용자의 환경을 로드한다는 것입니다.
이 방식으로 사용자를 전환하면 로그인 프로세스가 새로 시작되며 로그인 쉘, 환경 변수 등이 설정됩니다. '당연한 거 아닌가?'라는 생각을 하실 수도 있지만, su user의 경우 그렇지 않습니다.
su user
su user는 새로운 사용자로 전환하지만 현재 사용자(전환 전 사용자)의 환경 설정을 그대로 유지합니다. 로그인 쉘을 시작하지도 않습니다. 즉, - 옵션 없이 su로 사용자를 전환하면 비 로그인 쉘 상태가 됩니다.
예시 1) 로그인 / 비 로그인 쉘 차이
실제 테스트를 해보시면 다른 걸 정확히 알 수 있습니다.
root 계정에서 test라는 계정으로 - 옵션 없이도 문제 없이 사용자 전환이 됩니다. root 계정으로 다시 돌리는 것도 마찬가지입니다.
[root@localhost ~]# su test
[test@localhost root]$ su
Password:
[root@localhost ~]#
이번엔 - 옵션을 사용해서 같은 과정을 진행합니다. 위 결과와 다르게 Last login: 이라는 로그인 메시지가 출력되며 사용자가 쉘에 로그인하였음을 보여줍니다.
[root@localhost ~]# su - test
Last login: Tue Jun 13 00:58:36 PDT 2023 on pts/1
[test@localhost ~]$ su -
Password:
Last login: Tue Jun 13 00:58:52 PDT 2023 on pts/1
[root@localhost ~]#
즉, - 옵션 없는 전환은 비 로그인 쉘이며 - 옵션을 사용한 전환은 로그인 쉘로 간주됩니다.
예시 2-1) 환경변수 인식 - profile
리눅스에서 전역 환경변수를 설정할 수 있는 파일은 profile과 bashrc가 있습니다. profile은 로그인 쉘에 한해서 환경변수가 적용됩니다. 반면 bashrc는 비 로그인 쉘도 포함해서 환경변수가 적용됩니다. 이 차이를 고려해서 테스트를 진행해 보겠습니다.
먼저 profile에 TEST_PATH라는 환경변수를 만들어 /home/test 경로를 설정합니다.
[root@localhost ~]# vim /etc/profile
적용 후 TEST_PATH 환경변수가 정상적으로 출력됩니다.
[root@localhost ~]# source /etc/profile
[root@localhost ~]# echo $TEST_PATH
/home/test
이제 - 옵션과 함께 test 계정으로 전환합니다. - 옵션을 사용한 su는 로그인 쉘이기 때문에 사용자 전환 후에도 profile에 적용된 TEST_PATH를 정상적으로 인식하는 것이 확인됩니다.
[root@localhost ~]# su - test
Last login: Tue Jun 13 01:07:04 PDT 2023 on pts/1
[test@localhost ~]$ echo $TEST_PATH
/home/test
반면 - 옵션 없이 전환하면 비 로그인 쉘이기 때문에 profile에 적용된 환경변수를 인식하지 못합니다.
[test@localhost ~]$ su -
Password:
Last login: Tue Jun 13 01:07:20 PDT 2023 on pts/1
[root@localhost ~]# su test
[test@localhost root]$ echo $TEST_PATH
[test@localhost root]$
예시 2-2) 환경변수 인식 - bashrc
이번엔 bashrc에 BASHRC_TEST_PATH라는 환경변수를 설정합니다.
[root@localhost ~]# vim /etc/bashrc
적용 후 환경변수가 적용됐습니다.
[root@localhost ~]# source /etc/bashrc
[root@localhost ~]# echo $BASHRC_TEST_PATH
/home/test
- 옵션을 이용해서 test 계정으로 전환합니다. 로그인 쉘에서 BASHRC_TEST_PATH 환경변수가 정상적으로 인식됩니다.
[root@localhost ~]# su - test
Last login: Tue Jun 13 01:08:52 PDT 2023 on pts/1
[test@localhost ~]$ echo $BASHRC_TEST_PATH
/home/test
이번엔 - 옵션을 쓰지 않고 비 로그인 쉘로 진입합니다. 그럼에도 bashrc에 설정한 환경변수가 인식되는 것을 볼 수 있습니다.
[test@localhost ~]$ su -
Password:
Last login: Tue Jun 13 01:10:09 PDT 2023 on pts/1
[root@localhost ~]# su test
[test@localhost root]$ echo $BASHRC_TEST_PATH
/home/test
[test@localhost root]$
정리하면, su - user로 계정을 전환하는 것과 su user로 계정을 전환하는 것은 다릅니다. 그 차이를 알고 사용해야 합니다. 물론 환경변수가 크게 중요하지 않은 경우엔 별 문제가 없을 수 있습니다. 그러나 환경변수가 중요하게 작용하는 상황에선 주의할 필요가 있습니다. 저는 기본적으로 - 옵션을 사용해서 계정을 전환합니다.
'운영체제(OS)' 카테고리의 다른 글
리눅스 여러 파일에서 단어 찾는 방법 (0) | 2023.06.24 |
---|---|
CentOS 7 한국표준시 KST로 변경 방법 (0) | 2023.06.17 |
맥북 잘라내기 복사하기 붙여넣기 단축키 (0) | 2023.06.14 |
윈도우 경로 형식 정리 (로컬, 네트워크, 환경변수) (0) | 2023.06.10 |
리눅스 VI vs VIM 차이 (feat. 유용한 단축키) (0) | 2023.06.02 |