Linux의 su 와 su - 의 차이

2020-04-28

리눅스에서 다른 사용자로 전환해서 명령을 실행하고자 하는 경우 su 명령을 사용한다. 이 때, su 와 su - 로 실행한 명령에 차이가 있어 정리 해 둔다.

사건의 발단

리눅스 환경에서 루트쉘로 작업을 하던 도중 일반사용자 계정으로 프로그램을 실행하고자 할 때, 이미 설정 해 두었던 환경변수값이 적용되지 않던 문제가 있었다.

당시 실행한 명령은 다음과 같다.

su - webuser -c "node index.js"

실행한 명령은 webuser이라는 계정으로 node index.js라는 명령을 실행하라는 것이었다. index.js 안에는 시스템의 환경변수를 읽어서 개발과 운영모드를 구분하는 코드가 작성되어 있었다. 위 명령을 실행한 root셸에는 해당 환경변수가 설정이 되어 있었으나, 실제 프로그램 실행시에는 적용되지 않았다.

su - 는 로그인을 의미한다.

su 만으로 사용자를 변경 할 때에는 기존에 작업중인 디렉토리 및 환경변수, PATH 등을 유지하면서 사용자만 바꾸게 된다.

su - 의 경우에는 해당 사용자로 로그인하는 것을 의미하며, 로그인한 사용자의 기본 작업디렉토리 및 기본 환경변수, PATH등이 적용되게 된다.

따라서 su - 로 사용자를 변경하여 인라인으로 명령을 실행하고자 할 때에는 PATH 및 환경변수가 변경됨을 꼭 감안하고 있어야 할 것이다.

그래서 어떻게 해결했는가?

실행 명령 앞에 export로 필요한 환경변수를 직접 추가해서 해결하긴 했다. 더 좋은 방법이 있다면 추가로 정리를 해 보고자 한다.

su - webuser -c "export SERVICE_MODE=production && node index.js"

참고

  • https://storycompiler.tistory.com/44