Linux / 명령어 / su - 사용자 계정 전환

su는 대체 사용자와 그룹 ID로 셸 또는 명령을 실행하는 도구입니다. 사용자를 지정하지 않으면 일반적으로 root를 대상으로 하며, su --login 사용자를 사용하면 해당 사용자가 직접 로그인한 것과 비슷한 환경으로 전환할 수 있습니다.

단순한 su 사용자는 현재 작업 디렉터리와 환경 일부를 유지해 서로 다른 사용자의 설정이 섞일 수 있습니다. 대화형 계정 전환에는 보통 su --login 사용자를 사용하고, 관리자 명령 하나만 실행하려는 목적이라면 정책 기반의 sudo가 더 적합한지 먼저 검토하는 것이 좋습니다.

su 명령어란?

su는 substitute user and group ID, 즉 대체 사용자와 그룹 ID로 명령을 실행합니다. 사용자 이름을 생략하면 root 계정으로 대화형 셸을 실행하려고 합니다.

util-linux의 su는 PAM(Pluggable Authentication Modules)을 통해 인증, 계정과 세션 관리를 수행합니다. 어떤 비밀번호가 필요한지, 특정 그룹만 su를 사용할 수 있는지, 시도가 어디에 기록되는지는 배포판의 PAM과 보안 설정에 따라 달라질 수 있습니다.

이 글은 Linux에서 널리 사용되는 util-linux 구현을 기준으로 합니다. 정확한 동작과 시스템별 설정 파일은 util-linux su 공식 매뉴얼 페이지에서 확인할 수 있습니다.

기본 문법과 계정 전환

기본 문법은 다음과 같습니다.

su [옵션] [-] [사용자 [인수...]]

사용자를 지정하지 않으면 root 계정으로 전환을 시도합니다.

su

일반 사용자가 실행하면 보통 대상인 root 계정의 비밀번호를 요청합니다. root 계정이 잠겨 있거나 PAM 정책이 허용하지 않으면 올바른 사용자 비밀번호를 알고 있어도 전환할 수 없습니다.

특정 사용자로 전환하려면 계정 이름을 지정합니다.

su deploy

원래 셸로 돌아가려면 전환된 셸에서 exit를 실행하거나 Ctrl+D를 입력합니다.

exit

su와 su --login의 차이

구분 su 사용자 su --login 사용자
작업 디렉터리 현재 디렉터리를 유지 대상 사용자의 홈 디렉터리로 이동
환경 변수 일부만 변경되어 기존 환경과 섞일 수 있음 대부분 지우고 대상 사용자의 로그인 환경을 구성
PATH 시스템 설정과 PAM의 영향을 받음 대상 로그인 환경에 맞게 초기화
셸 시작 방식 일반 대화형 셸 로그인 셸로 시작
권장 상황 환경 유지가 의도된 제한적인 경우 일반적인 대화형 사용자 전환

util-linux 매뉴얼은 환경 혼합으로 인한 부작용을 피하기 위해 --login 사용을 권장합니다. 짧은 형식인 -도 같은 의미입니다.

su --login deploy
su - deploy

로그인 셸에서 바뀌는 환경

대부분의 기존 환경 변수를 정리한다

util-linux의 su --login은 TERM, COLORTERM, NO_COLOR와 명시적으로 허용한 변수를 제외하고 기존 환경을 지웁니다. 이후 HOME, SHELL, USER, LOGNAME, PATH를 대상 사용자 기준으로 초기화합니다.

최종 환경에는 PAM 모듈이 추가하거나 변경한 값도 반영될 수 있으므로 배포판마다 완전히 같다고 가정하면 안 됩니다.

대상 사용자의 홈 디렉터리로 이동한다

--login은 대상 사용자의 홈 디렉터리로 이동한 뒤 로그인 셸을 시작합니다. 전환 후에는 다음 명령으로 사용자·홈·작업 디렉터리를 확인할 수 있습니다.

id
printf '%s\n' "$HOME"
pwd

셸 초기화 파일이 달라진다

로그인 셸은 사용하는 셸의 규칙에 따라 로그인용 초기화 파일을 읽습니다. Bash라면 시스템과 사용자 설정에 따라 /etc/profile, ~/.bash_profile 등의 영향을 받을 수 있습니다. 실제 순서는 대상 셸의 매뉴얼과 해당 계정의 설정을 확인하세요.

자주 사용하는 su 옵션

옵션 기능 활용과 주의점
-, -l, --login 로그인 셸 환경으로 전환 대화형 전환에 일반적으로 권장
-c 명령, --command 명령 셸에 단일 명령 전달 인용과 종료 상태를 확인해야 함
-s 셸, --shell 셸 실행할 셸 지정 제한 셸 계정에서는 호출자가 root가 아니면 무시될 수 있음
-m, -p, --preserve-environment 현재 환경을 최대한 보존 --login과 함께 쓰면 무시되며 보안상 신중히 사용
-w 목록, --whitelist-environment 목록 로그인 전환 시 지정 환경 변수를 보존 쉼표로 구분하며 핵심 계정 변수는 제외
-P, --pty 세션에 별도 의사 터미널 생성 대화형 세션의 터미널 분리에 유용
-g 그룹 기본 그룹 지정 root 사용자만 사용할 수 있음
-G 그룹 보조 그룹 지정 root 사용자만 사용할 수 있으며 반복 가능

다른 사용자로 단일 명령 실행하기

-c로 명령 하나 실행하기

대화형 셸에 머물 필요가 없다면 -c로 대상 사용자의 셸에 명령을 전달할 수 있습니다.

su -c 'id' deploy

명령이 끝나면 su도 종료되고 원래 셸로 돌아옵니다. 명령 문자열은 대상 셸이 다시 해석하므로 따옴표, 변수 확장과 리디렉션의 실행 시점을 주의해야 합니다.

로그인 환경에서 명령 실행하기

대상 사용자의 로그인 환경과 홈 디렉터리에서 명령을 실행하려면 --login을 함께 사용합니다.

su --login -c 'pwd; id' deploy

세미콜론으로 연결된 두 명령 모두 대상 사용자의 셸 안에서 실행됩니다. 외부 입력을 명령 문자열에 직접 이어 붙이면 명령 주입 위험이 있으므로 동적으로 만든 문자열을 높은 권한으로 전달하지 마세요.

명령의 종료 상태 확인하기

su는 일반적으로 실행한 명령의 종료 상태를 반환합니다. util-linux 구현에서 명령을 실행할 수 없으면 126, 명령을 찾지 못하면 127, 명령 실행 전 일반 오류는 1을 반환할 수 있습니다.

su -c '/usr/local/bin/check-job' deploy
status=$?
printf 'exit=%s\n' "$status"

자동화에서는 출력 문자열뿐 아니라 종료 상태를 확인해야 합니다.

셸과 제한 계정 다루기

대상 사용자의 기본 셸

별도 옵션이 없다면 일반적으로 대상 계정의 passwd 항목에 지정된 셸을 사용하고, 없으면 /bin/sh로 대체합니다. 계정 정보를 확인할 때는 전체 /etc/passwd를 임의로 수정하지 말고 다음처럼 조회합니다.

getent passwd deploy

-s로 셸 지정하기

-s로 다른 셸을 지정할 수 있습니다.

su -s /bin/sh -c 'id' deploy

대상 계정의 셸이 /etc/shells에 없는 제한 셸이라면 일반 사용자가 지정한 셸은 무시될 수 있습니다. root가 제한을 우회할 수 있다고 해서 서비스 계정에 대화형 셸을 열어도 안전하다는 뜻은 아닙니다.

서비스 계정의 목적을 존중하기

nologin이나 false가 셸로 지정된 계정은 대화형 로그인용이 아닐 가능성이 큽니다. 해당 계정으로 작업해야 한다면 필요한 명령 하나만 실행하고, 서비스가 제공하는 관리 명령이나 systemd 기능이 있는지도 먼저 확인하세요.

환경 변수 보존은 신중하게 사용하기

--preserve-environment의 의미

--preserve-environment는 HOME, SHELL, USER, LOGNAME을 새로 설정하지 않고 현재 환경을 보존합니다. --login과 함께 지정하면 무시됩니다.

su --preserve-environment deploy

호출 사용자의 설정을 그대로 전달해야 하는 특수한 경우가 아니라면 대상 계정의 홈과 실행 환경이 섞여 예상하지 못한 파일 소유권이나 설정 변경을 만들 수 있습니다.

필요한 변수만 허용하기

util-linux에서는 --login과 --whitelist-environment를 조합해 필요한 변수만 보존할 수 있습니다.

su --login --whitelist-environment=LANG,LC_ALL deploy

HOME, SHELL, USER, LOGNAME, PATH는 화이트리스트 대상에서 제외됩니다. 로케일 변수도 프로그램 동작에 영향을 줄 수 있으므로 꼭 필요한 값만 전달하세요.

su와 sudo의 차이

구분 su sudo
주요 목적 대체 사용자로 셸 또는 명령 실행 정책이 허용한 명령을 다른 사용자로 실행
일반적인 인증 대상 사용자의 비밀번호 호출 사용자의 비밀번호
권한 범위 전환된 셸에서 대상 계정 권한을 계속 사용 가능 허용된 명령과 조건으로 제한 가능
감사와 추적 세션 전환 기록 중심이며 내부 명령 추적은 별도 필요 실행 요청을 정책·로깅 플러그인으로 기록 가능
적합한 상황 대상 계정의 대화형 환경이 필요한 경우 관리 명령 하나 또는 역할별 최소 권한 실행

인증 방식과 로깅은 PAM과 정책에 따라 달라질 수 있으므로 위 표는 일반적인 비교입니다. root 명령 하나만 필요하다면 계정 비밀번호를 공유하는 su보다 권한을 명령별로 제한할 수 있는 sudo가 더 적합한 경우가 많습니다. 자세한 사용법은 Linux sudo 명령어와 sudoers 설정을 참고하세요.

root 계정으로 전환되지 않는 이유

root 계정이 잠겨 있을 수 있다

일부 배포판은 root 계정의 비밀번호 로그인을 기본적으로 잠그고 sudo를 통한 관리 방식을 사용합니다. 이 경우 su -에서 현재 사용자의 비밀번호를 입력해도 성공하지 않습니다.

사용자가 sudo 권한을 갖고 있고 정책이 허용한다면 로그인 형태의 root 셸은 다음과 같이 열 수 있지만, 개별 명령만 필요한 경우에는 관리자 셸보다 sudo 명령을 사용하는 편이 안전합니다.

sudo -i

PAM 또는 그룹 정책이 제한할 수 있다

/etc/pam.d/su의 정책은 특정 그룹만 su를 사용하도록 제한하거나 추가 인증 조건을 적용할 수 있습니다. 권한을 얻기 위해 PAM 설정을 임의로 약화하지 말고 시스템 관리자에게 필요한 작업과 대상 계정을 전달하세요.

대상 계정 상태에 문제가 있을 수 있다

계정 만료, 잠금, 잘못된 홈 디렉터리, 제한된 셸과 파일 권한 때문에 전환이 실패할 수 있습니다. 관리자라면 getent passwd 사용자, 계정 관리 도구와 인증 로그를 통해 원인을 확인하세요.

root가 다른 사용자로 실행할 때

자동화에는 runuser가 더 적합할 수 있다

util-linux 매뉴얼은 이미 높은 권한을 가진 프로세스나 root의 스크립트에서 다른 사용자로 실행할 때 runuser를 권장합니다. runuser는 set-user-ID가 아니고 비밀번호 인증을 요구하지 않으며 별도의 PAM 구성을 사용합니다.

runuser -u backup -- /usr/local/bin/backup-job

runuser는 root가 사용하는 관리 도구이므로 일반 사용자가 sudo를 대신해 권한을 얻는 명령은 아닙니다.

PAM 세션이 필요 없다면 목적을 다시 검토하기

단순히 사용자·그룹 ID와 권한 속성을 바꿔 프로그램을 실행해야 하고 PAM 세션이 필요 없다면 util-linux는 setpriv도 대안으로 안내합니다. 이 도구는 권한과 보안 속성을 직접 다루므로 정확한 사용자·그룹·보조 그룹·기능 설정을 이해한 관리자만 사용해야 합니다.

의사 터미널로 세션 분리하기

--pty가 제공하는 분리

--pty는 원래 세션과 대상 세션 사이에 별도의 의사 터미널을 만들고 su가 입출력을 중계합니다. 대화형 세션에서 두 세션이 같은 터미널을 직접 공유하지 않도록 해 보안을 개선할 수 있습니다.

su --pty --login deploy

완전한 systemd 로그인 세션은 아니다

su --login을 사용해도 systemd-logind 관점에서 완전히 새로운 실제 로그인 세션을 만드는 것은 아닙니다. 사용자 서비스, 좌석, 세션 경계가 필요한 작업이라면 systemd-run이나 machinectl처럼 목적에 맞는 도구를 검토해야 합니다.

보안상 주의할 점

  • root 비밀번호나 다른 사용자의 비밀번호를 여러 사람과 공유하지 않습니다.
  • 비밀번호를 명령행, 셸 기록, 스크립트, 파이프에 넣지 않습니다.
  • 불필요하게 root 셸을 오래 유지하지 않고 작업 후 즉시 exit합니다.
  • 전환 직후 id, pwd, HOME을 확인해 사용자와 경로를 착각하지 않도록 합니다.
  • 높은 권한으로 실행할 명령은 옵션, 대상 경로와 와일드카드 확장 결과를 먼저 검토합니다.
  • 로그가 남는다고 가정하지 말고 PAM·저널·인증 로그의 실제 설정과 보존 정책을 확인합니다.

su로 root 셸을 연 뒤 실행한 각 명령은 su 자체의 인증 기록과 별개입니다. 개별 명령 감사가 필요하다면 셸 감사, 중앙 로깅 또는 명령 단위 정책을 제공하는 sudo 같은 방식을 함께 설계해야 합니다.

자주 발생하는 문제와 해결 방법

증상 가능한 원인 확인 방법
Authentication failure 대상 비밀번호 오류, 계정 잠금 또는 PAM 제한 대상 계정과 인증 정책·로그 확인
전환 후 명령을 찾지 못함 대상 사용자의 PATH가 다름 command -v와 printf '%s\n' "$PATH" 확인
홈 디렉터리가 바뀌지 않음 로그인 옵션 없이 su 사용자 사용 su --login 사용자 사용
사용자 설정이 섞여 보임 기존 환경을 일부 유지한 일반 su 사용 env, HOME, USER 확인
지정한 셸이 실행되지 않음 제한 셸 또는 호출 권한 제한 getent passwd와 /etc/shells 확인

자주 묻는 질문

su에는 누구의 비밀번호를 입력하나요?

일반적으로 전환하려는 대상 사용자의 비밀번호를 입력합니다. 다만 root가 실행하거나 PAM 정책이 다른 인증 방식을 사용하는 경우에는 동작이 달라질 수 있습니다. 비밀번호 입력 중 문자가 화면에 표시되지 않는 것은 정상입니다.

su와 su -는 무엇이 다른가요?

su는 현재 디렉터리와 환경 일부를 유지한 채 root 셸을 실행하려고 합니다. su -는 root의 홈으로 이동하고 로그인 환경을 구성합니다. util-linux에서는 환경 혼합을 줄이기 위해 로그인 형식을 권장합니다.

su로 전환한 뒤 현재 사용자를 어떻게 확인하나요?

id는 실제·유효 사용자와 그룹을 함께 확인하는 데 유용합니다. 간단한 사용자 이름만 필요하면 whoami를 사용할 수 있지만, 보조 그룹까지 확인하려면 id가 더 많은 정보를 제공합니다.

스크립트에 su 비밀번호를 넣어도 되나요?

안 됩니다. 비밀번호가 파일, 프로세스 정보나 로그에 노출될 수 있습니다. root의 자동화라면 제한된 runuser, 일반 사용자의 권한 상승이라면 최소 권한 sudoers 규칙이나 작업 전용 서비스처럼 비밀번호를 내장하지 않는 방식을 설계하세요.

정리

일반적인 대화형 계정 전환은 su --login 사용자, 단일 명령은 su -c '명령' 사용자로 실행할 수 있습니다. 단순한 su 사용자는 환경이 섞일 수 있으므로 전환 후 id, HOME, pwd를 확인하는 것이 좋습니다.

root 명령 하나를 실행하려는 목적이라면 명령별 권한 제어와 감사를 제공하는 sudo가 더 적합할 수 있습니다. root 자동화에서 다른 사용자로 실행할 때는 runuser를 검토하세요. 관련 기본 도구는 리눅스에서 자주 사용하는 명령어 목록에서 함께 살펴볼 수 있습니다.

같은 카테고리의 다른 글
Linux / 명령어 / systemctl - systemd 서비스 상태 확인과 관리

Linux / 명령어 / systemctl - systemd 서비스 상태 확인과 관리

Linux systemctl 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / pgrep - 조건에 맞는 프로세스 ID 검색

Linux / 명령어 / pgrep - 조건에 맞는 프로세스 ID 검색

Linux pgrep 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / alias - 명령어 별칭 만들기

Linux / 명령어 / alias - 명령어 별칭 만들기

Bash alias 명령어로 자주 쓰는 명령과 옵션 조합에 짧은 별칭을 만드는 방법을 설명합니다. 별칭 저장, 우회, 함수와의 차이 및 확장되지 않는 경우도 정리합니다.

Linux / 명령어 / hostnamectl - 호스트 이름과 시스템 정보 확인·변경

Linux / 명령어 / hostnamectl - 호스트 이름과 시스템 정보 확인·변경

Linux hostnamectl 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / locate - 파일 이름 색인에서 빠르게 경로 검색

Linux / 명령어 / locate - 파일 이름 색인에서 빠르게 경로 검색

Linux locate 명령어로 파일 이름 색인을 빠르게 검색하는 방법을 설명합니다. updatedb, 최신성 한계, 패턴과 정규 표현식, find와의 차이를 정리합니다.

Linux / 명령어 / ssh-copy-id - SSH 공개키를 원격 계정에 등록

Linux / 명령어 / ssh-copy-id - SSH 공개키를 원격 계정에 등록

Linux ssh-copy-id 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / bg - 중지된 셸 작업을 백그라운드에서 재개

Linux / 명령어 / bg - 중지된 셸 작업을 백그라운드에서 재개

Linux bg 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / sudo - 다른 사용자 권한으로 명령 실행

Linux / 명령어 / sudo - 다른 사용자 권한으로 명령 실행

Linux sudo 명령어로 허용된 명령을 root 또는 다른 사용자 권한으로 실행하는 방법을 설명합니다. 주요 옵션, 인증 캐시, 리디렉션 문제, visudo와 최소 권한 sudoers 설정 원칙을 정리합니다.

Linux / 명령어 / mv - 파일 이동과 이름 변경

Linux / 명령어 / mv - 파일 이동과 이름 변경

Linux mv 명령어로 파일과 디렉터리를 이동하거나 이름을 변경하는 방법을 설명합니다. 덮어쓰기 방지, 파일 시스템 간 이동과 안전한 자동화 방법도 정리합니다.

Linux / 명령어 / gunzip - gzip 압축 파일 풀기

Linux / 명령어 / gunzip - gzip 압축 파일 풀기

Linux gunzip 명령어의 용도와 기본 문법을 알아봅니다. 파일 처리 예제, 주요 옵션과 원본 보존·덮어쓰기 주의점을 설명합니다.