su 명령어: su와 su -의 차이, sudo su와 sudo -i까지 계정 바꾸는 법

공정위 광고 문구 Ver 3.1
공정위 광고 문구 Ver 3.2(모바일 전용)
테스트 환경RHEL 계열AlmaLinux 9.8util-linux 2.37root 계정Debian 12 · util-linux 2.38 일반 계정2026-11-05 확인
사용자 · 그룹 명령어su위치/usr/bin/su
다른 계정 명령어 실행

리눅스에서 지금 계정을 로그아웃하지 않고 다른 계정으로 바꿔 명령을 실행할 때는 su 명령어를 사용합니다. AlmaLinux 9 서버의 root 계정에서 로그인할 수 없는 시스템 계정 daemon으로 su를 실행해 비교한 결과, 하이픈 하나로 작업 폴더와 PATH가 달라졌고 셸을 지정해야 명령이 실행되었습니다.

아래 출력은 AlmaLinux 9.8 서버(root 계정)와 Debian 12 서버(일반 계정)에서 실행한 결과입니다. 비밀번호를 묻는 화면과 sudo는 운영 중인 서버에서 실행하지 않고 공식 매뉴얼 기준으로 정리했고, PATH 값 일부와 시뮬레이터의 util-linux 패치 버전 번호는 예시 값으로 바꿨습니다.

1️⃣ su 명령어 사용법

  • ↪️ 기본 형식과 exit로 돌아오기

기본 형식은 [su 계정 이름]이고, 계정 이름을 생략하면 root로 바꿉니다. 바꾼 셸에서 exit를 입력하면 그 셸이 끝나고 su를 실행한 원래 계정의 셸로 돌아옵니다.

일반 계정에서 실행하면 Password: 줄에 바꿀 계정의 비밀번호를 입력합니다(PAM 기본 설정 기준). 이 서버의 /etc/pam.d/su는 실행한 사람이 root면 인증을 건너뛰도록 되어 있어, root 계정에서 daemon으로 바꿀 때는 비밀번호를 묻지 않았습니다.

su --help

Usage:
 su [options] [-] [<user> [<argument>...]]

Change the effective user ID and group ID to that of <user>.
A mere - implies -l.  If <user> is not given, root is assumed.

Options:
 -m, -p, --preserve-environment      do not reset environment variables
 -w, --whitelist-environment <list>  don't reset specified variables

 -g, --group <group>             specify the primary group
 -G, --supp-group <group>        specify a supplemental group

 -, -l, --login                  make the shell a login shell
 -c, --command <command>         pass a single command to the shell with -c
 --session-command <command>     pass a single command to the shell with -c
                                   and do not create a new session
 -f, --fast                      pass -f to the shell (for csh or tcsh)
 -s, --shell <shell>             run <shell> if /etc/shells allows it
 -P, --pty                       create a new pseudo-terminal

 -h, --help                      display this help
 -V, --version                   display version

For more details see su(1).

도움말에 적힌 대로 하이픈 [-]는 [-l]과 같은 로그인 옵션이고, 계정 이름 뒤에 적은 인자는 바꾼 계정의 셸로 넘어갑니다. AlmaLinux 9 서버의 su는 util-linux 2.37 패키지, Debian 12 서버의 su는 2.38 패키지에 들어 있었습니다.

su --version
su from util-linux 2.38.1

바꾸려는 계정이 셸을 열 수 있는지는 getent passwd로 계정 줄의 마지막 칸을 보면 알 수 있습니다.

getent passwd daemon
daemon:x:2:2:daemon:/sbin:/sbin/nologin

daemon의 셸은 /sbin/nologin이었습니다. 로그인용 셸 대신 nologin이 들어 있는 계정은 su로 바꿔도 셸이 열리지 않습니다.

2️⃣ su와 su -의 차이

  • ↪️ 로그인 셸과 환경 변수

하이픈(-)을 붙이면 su는 바꾼 계정으로 로그인한 것과 같은 셸을 엽니다. /tmp 폴더에서 같은 명령을 하이픈 없이 한 번, 하이픈을 붙여 한 번 실행했습니다.

su -s /bin/sh -c pwd daemon
/tmp
su - -s /bin/sh -c pwd daemon
/usr/sbin

하이픈이 없으면 작업 폴더가 /tmp 그대로였고, [su -]는 daemon의 홈 폴더 /sbin으로 옮겨 갔습니다. 이 서버의 /sbin은 /usr/sbin을 연결한 링크라 pwd에는 /usr/sbin이 나왔습니다.

환경 변수는 env 출력에서 HOME과 USER, SHELL, PATH, LOGNAME 다섯 줄만 골라 비교했습니다.

su -s /bin/sh -c env daemon | grep -E '^(HOME|USER|SHELL|PATH|LOGNAME)='
SHELL=/bin/sh
LOGNAME=daemon
HOME=/sbin
USER=daemon
PATH=/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
su - -s /bin/sh -c env daemon | grep -E '^(HOME|USER|SHELL|PATH|LOGNAME)='
SHELL=/bin/sh
LOGNAME=daemon
HOME=/sbin
USER=daemon
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

HOME과 USER, LOGNAME은 두 경우 모두 daemon의 값으로 바뀌었습니다. PATH는 하이픈이 없을 때 su를 실행한 root의 값이 그대로 남았고, [su -]에서는 로그인 설정에 따라 새로 정해졌습니다.

공식 매뉴얼 기준으로 하이픈 없는 su는 HOME과 SHELL만 바꾸고, 바꿀 계정이 root가 아닐 때만 USER와 LOGNAME도 바꿉니다. 그래서 일반 계정에서 하이픈 없이 root로 바꾸면 USER에는 원래 계정 이름이 남습니다.

셸 이름을 출력하는 [$0]도 달랐습니다.

su -s /bin/sh -c 'echo $0' daemon
sh
su - -s /bin/sh -c 'echo $0' daemon
-sh

[su -]에서는 셸 이름 앞에 하이픈이 붙어 -sh가 나왔습니다. 셸은 이름이 하이픈으로 시작하면 로그인 셸로 동작해 로그인 설정 파일을 읽습니다(공식 매뉴얼 기준). 두 꼴의 차이는 아래와 같습니다.

비교susu -
작업 폴더그대로(/tmp)바꾼 계정의 홈 폴더(/usr/sbin)
HOME, USER, LOGNAMEdaemon의 값daemon의 값
PATHsu를 실행한 root의 값로그인 설정으로 새로 정함
셸 이름($0)sh-sh(로그인 셸)
그 밖의 환경 변수그대로 남음TERM 등 일부만 남기고 지움(공식 매뉴얼 기준)

공식 매뉴얼은 환경이 섞이지 않도록 로그인 옵션을 늘 붙이고, 하이픈 대신 [--login]으로 적기를 권합니다. 하이픈 없는 su는 지금 폴더와 PATH가 남아, 다른 계정의 설정으로 명령을 확인하려는 경우에는 [su -]와 다른 결과가 나올 수 있습니다.

3️⃣ su -c와 su -s 옵션

  • ↪️ 명령 하나만 실행하기와 셸 지정

셸을 열지 않고 명령 하나만 다른 계정으로 실행할 때는 -c 뒤에 명령을 적습니다. nologin 계정에 [su -c]로 id를 실행하자 명령 대신 거절 문구가 나왔습니다.

su -c id daemon
This account is currently not available.

-c로 넘긴 명령도 계정의 셸이 받아 실행하므로, 셸이 nologin이면 명령까지 가지 못합니다. 이럴 때는 -s로 실행할 셸을 지정합니다.

su -s /bin/sh -c id daemon
uid=2(daemon) gid=2(daemon) groups=2(daemon)

/bin/sh를 지정하자 id가 daemon의 UID 2로 실행되었습니다. 서비스 계정으로 파일 권한이나 명령 결과를 확인할 때 이 꼴을 사용합니다.

바꿀 계정의 셸이 nologin처럼 /etc/shells에 없는 제한된 셸이면, -s로 셸을 바꾸는 것은 root에서만 됩니다. 공식 매뉴얼 기준으로 root가 아닌 사용자가 지정한 -s와 SHELL 변수는 이때 무시됩니다.

-c 뒤 명령에 공백이 있으면 따옴표로 묶어 한 덩어리로 넘깁니다. su는 실행한 명령의 종료 코드를 그대로 반환하고, 명령을 실행하지 못하면 126, 찾지 못하면 127을 반환합니다(공식 매뉴얼 기준).

📌 주요 옵션: 이 글에서 실행한 결과

옵션하는 일이 글에서 본 결과
-바꾼 계정으로 로그인한 것과 같은 셸을 열고 그 계정의 홈 폴더로 옮김/tmp에서 하이픈 없이는 pwd가 /tmp, 붙이면 /usr/sbin이고 echo $0은 -sh
-c 명령셸을 열지 않고 명령 하나를 바꾼 계정의 셸로 실행nologin 계정 daemon에 su -c id daemon을 실행하자 [This account is currently not available.]
-s 셸계정에 적힌 셸 대신 지정한 셸로 실행, 제한된 셸 계정은 root만su -s /bin/sh -c id daemon이 uid=2(daemon) gid=2(daemon) groups=2(daemon)
--help사용법과 옵션 목록을 출력Usage 줄과 -m, -w, -g, -G, -l, -c, -f, -s, -P, -h, -V 옵션 목록
--version버전 정보를 출력Debian 12 서버에서 su from util-linux 2.38.1

📎 그 밖의 옵션: 공식 매뉴얼 기준

옵션하는 일
-l하이픈(-)과 같은 로그인 옵션, 긴 이름은 --login
-m환경 변수를 그대로 두고 HOME, SHELL, USER, LOGNAME도 바꾸지 않음, 로그인 옵션과 함께 쓰면 무시(-p와 같음)
-w 목록로그인 옵션으로 환경을 비울 때 쉼표로 적은 변수를 남김, HOME, SHELL, USER, LOGNAME, PATH는 새로 정함
-g 그룹주 그룹을 지정, root만 사용
-G 그룹보조 그룹을 지정, root만 사용, -g가 없으면 첫 보조 그룹이 주 그룹
-f셸에 -f를 넘김, csh나 tcsh에서 쓰는 옵션
-P새 의사 터미널을 만들어 원래 세션과 터미널을 함께 쓰지 않음
--session-command 명령-c와 같지만 새 세션을 만들지 않음, 매뉴얼은 권하지 않음

🔲 su 명령어 시뮬레이터

아래 시뮬레이터는 일반 계정 user1로 시작하며, su와 [su -], sudo를 입력하고 exit로 돌아오는 흐름을 직접 확인할 수 있습니다. 계정과 비밀번호는 예시 값입니다.

su 명령어 시뮬레이터util-linux 2.37
[user1@server1 ~]$
브라우저 안에서만 동작하며, 계정과 비밀번호는 예시 값이고 ↑↓ 로 앞에서 쓴 명령을 다시 불러옵니다(비밀번호는 기록에 남지 않습니다).

4️⃣ sudo su와 sudo -i 차이

  • ↪️ 묻는 비밀번호와 바뀌는 폴더

sudo su는 sudo로 su를 root 권한으로 실행하는 꼴입니다. su를 root가 실행하므로 root 비밀번호를 묻지 않고, 그 앞에서 sudo가 실행한 사람의 비밀번호를 묻습니다(공식 문서 기준).

sudo를 실행할 수 있는 계정은 /etc/sudoers 설정으로 정해집니다. 허용되지 않은 계정이 sudo를 실행하면 [user1 is not in the sudoers file.]로 거절됩니다(프로그램 안 문구 기준).

root 셸을 여는 명령마다 묻는 비밀번호와 작업 폴더는 아래와 같습니다. 이 장의 명령은 운영 중인 서버에서 실행하지 않았고, su(1)과 sudo(8) 매뉴얼 기준으로 정리했습니다.

명령묻는 비밀번호실행되는 셸작업 폴더
surootroot 셸그대로
su -rootroot 로그인 셸/root
sudo su실행한 계정root 셸그대로
sudo su -실행한 계정root 로그인 셸/root
sudo -i실행한 계정root 로그인 셸/root
sudo -s실행한 계정SHELL 변수의 셸(root 권한)그대로

[sudo -i]와 [sudo su -]는 둘 다 root 로그인 셸로 끝납니다. [sudo -i]는 sudo가 root의 셸을 바로 로그인 셸로 실행하고, [sudo su -]는 그 사이에 su를 한 번 더 거칩니다.

[sudo -s]는 SHELL 변수의 셸을 root 권한으로 실행하며 홈 폴더로 옮기지 않습니다. sudo는 비밀번호를 한 번 맞게 입력하면 기본값 5분 동안 같은 터미널에서 다시 묻지 않습니다(sudoers 매뉴얼 기준).

su와 sudo의 차이는 집 열쇠를 빌리는 것과 관리실에 이름을 적고 출입하는 것의 차이와 같습니다.

5️⃣ su 명령어 오류

  • ↪️ This account is currently not available · Authentication failure

로그인할 수 없는 계정으로 바꾸면 셸 대신 nologin이 실행되어 [This account is currently not available.]가 나옵니다. root에서 [su daemon]을 실행하자 이 한 줄만 나오고 종료 코드는 1이었습니다.

su daemon
This account is currently not available.

이 문구는 계정 줄의 마지막 칸에 적힌 nologin 프로그램이 출력하며, 서버의 /usr/sbin/nologin 안에서 같은 문구를 확인했습니다. root라면 -s로 셸을 지정해 그 계정으로 명령을 실행할 수 있습니다.

비밀번호가 맞지 않으면 [su: Authentication failure]가 나옵니다. 이 글자는 PAM 라이브러리가 인증 실패에 돌려주는 문구입니다. 공식 매뉴얼 기준으로 su가 명령을 실행하기 전에 실패하면 종료 코드는 1입니다.

내 계정 비밀번호를 정확히 넣었는데도 su가 거절한다면, 바꿀 계정의 비밀번호를 넣어야 하는 자리인지부터 확인합니다. sudo는 실행한 사람의 비밀번호를 묻고, su는 바꿀 계정의 비밀번호를 묻기 때문입니다.

없는 계정 이름을 적으면 [su: user user9 does not exist or the user entry does not contain all the required fields]가 나옵니다(프로그램 안 문구 기준). 오류마다 원인과 확인할 것은 아래와 같습니다.

출력원인확인할 것
This account is currently not available.바꾼 계정의 셸이 nologingetent passwd 계정 줄의 마지막 칸 · root는 -s로 셸 지정
su: Authentication failure비밀번호가 맞지 않음바꿀 계정의 비밀번호인지(sudo는 내 비밀번호)
su: user user9 does not exist …그 이름의 계정이 없음getent passwd 계정 이름
user1 is not in the sudoers file.sudo를 허용하지 않은 계정sudoers 설정과 wheel 그룹

🔢 FAQ & 추천 콘텐츠

공식 매뉴얼은 su를 주로 일반 사용자를 위한 명령으로 설명하고, root가 실행하는 스크립트에는 인증을 거치지 않는 runuser 명령을 권합니다. 형식은 [runuser -u 계정 -- 명령]입니다.

-w(--whitelist-environment) 뒤에 남길 변수 이름을 쉼표로 이어 적으면, [su -]가 환경을 비울 때 그 변수를 남깁니다. 공식 매뉴얼 기준으로 HOME과 SHELL, USER, LOGNAME, PATH는 목록에 있어도 새로 정해집니다.

공식 매뉴얼 기준으로 su는 실패한 로그인 시도를 btmp 파일에 늘 기록하고, lastlog 파일에는 쓰지 않습니다. btmp 기록은 lastb 명령으로 확인합니다.

ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

인간임을 증명하세요: 1   +   5   =