1. 개요

서버를 쓰다 보면 처음 만든 계정 이름을 바꾸고 싶을 때가 있다. 새로 계정을 만들고 파일을 옮기는 방법도 있지만, usermod를 쓰면 UID와 파일 소유권을 그대로 유지한 채 이름만 바꿀 수 있다.

다만 이름 변경은 “명령 한 줄”로 끝나지 않는다. 바꾸려는 계정으로 로그인한 상태에서는 변경할 수 없고, 홈 디렉토리와 그룹 이름은 따로 바꿔야 하며, 이전 이름이 남는 파일도 있다. 이번 글에서는 12번 글의 usermod, /etc/passwd 내용을 바탕으로 Ubuntu에서 사용자 이름을 바꾸는 전체 과정을 정리한다.

글 전체에서 기존 사용자는 devuser, 새 이름은 appuser를 사용한다.


2. 이름을 바꾸면 무엇이 바뀌는가

12번 글에서 본 것처럼 리눅스는 사용자를 이름이 아니라 UID 로 구분한다. 파일 소유자도 UID로 저장되므로, 이름만 바꾸면 파일은 자동으로 새 이름의 소유가 된다.

항목 usermod -l로 이름만 바꿨을 때
UID, GID 그대로 유지
파일 소유권 그대로 유지 (UID 기준이라 새 이름으로 표시됨)
보조 그룹 소속 (sudo 등) 새 이름으로 자동 반영
홈 디렉토리 경로 바뀌지 않음 (/home/devuser 그대로)
같은 이름의 기본 그룹 바뀌지 않음 (devuser 그룹 그대로)
설정 파일·스크립트 속 이름과 경로 바뀌지 않음

즉, 이름을 바꾼 뒤 홈 디렉토리와 그룹 이름을 추가로 바꾸고, 이전 이름이 남아 있는 곳을 찾아 정리해야 한다.


3. 변경 전 준비

다른 관리자 계정으로 작업하기

usermod는 실행 중인 프로세스가 있는 사용자의 이름을 바꾸지 못한다. 자기 자신의 이름을 바꾸려고 하면 로그인 셸 자체가 그 사용자의 프로세스이므로 다음과 같이 실패한다.

usermod: user devuser is currently used by process 1234

그래서 devuser가 아닌, sudo를 쓸 수 있는 다른 계정으로 작업해야 한다. 서버에 이미 다른 관리자 계정이 있다면 그 계정을 쓰면 되고, 없다면 임시 계정을 하나 만든다.

sudo adduser tempadmin
sudo usermod -aG sudo tempadmin

그다음 devuser의 모든 세션(데스크톱 로그인, SSH, tmux 등)에서 로그아웃하고, tempadmin으로 새로 접속한다.

남아 있는 프로세스 확인

로그아웃했더라도 백그라운드 프로세스가 남아 있을 수 있다. 먼저 확인한다.

ps -u devuser

아무것도 나오지 않으면 다음 단계로 넘어간다. 프로세스가 남아 있다면 종료한다.

sudo pkill -u devuser          # 정상 종료 요청 (SIGTERM)
sudo pkill -KILL -u devuser    # 그래도 남아 있으면 강제 종료

pkill -u는 그 사용자가 실행한 모든 프로세스를 종료한다. 해당 사용자로 실행 중인 서비스나 VM이 있다면 함께 내려가므로, 무엇이 실행 중인지 ps -u devuser 결과를 먼저 살펴보는 것이 좋다. 특히 -KILL은 프로그램에 정리할 기회를 주지 않고 바로 끝내기 때문에, VM이라면 전원을 뽑은 것과 같다.


4. 이름, 홈 디렉토리, 그룹 바꾸기

tempadmin(또는 다른 관리자 계정)에서 다음 세 단계를 순서대로 실행한다.

먼저 로그인 이름을 바꾼다.

sudo usermod -l appuser devuser

-l 새이름 기존이름 순서다. 이제 /etc/passwd의 첫 번째 필드가 appuser가 되지만, 홈 디렉토리는 여전히 /home/devuser다.

다음으로 홈 디렉토리를 새 이름에 맞게 옮긴다.

sudo usermod -d /home/appuser -m appuser
옵션 의미
-d /etc/passwd에 기록된 홈 디렉토리 경로를 변경
-m 기존 홈 디렉토리의 내용을 새 경로로 이동

-m 없이 -d만 쓰면 경로 기록만 바뀌고 실제 파일은 /home/devuser에 남아, 로그인했을 때 홈 디렉토리가 없는 상태가 된다.

마지막으로 사용자와 같은 이름으로 만들어진 기본 그룹의 이름을 바꾼다.

sudo groupmod -n appuser devuser

-n 새이름 기존이름 순서다. GID는 그대로이므로 파일의 소유 그룹도 자동으로 새 이름으로 표시된다.

필요하다면 /etc/passwd의 설명(GECOS) 필드도 바꾼다.

sudo usermod -c "App User" appuser

5. 결과 확인하기

계정 정보가 제대로 바뀌었는지 확인한다.

id appuser
getent passwd appuser
ls -ld /home/appuser
id devuser

정상이라면 다음처럼 나온다.

uid=1002(appuser) gid=1002(appuser) groups=1002(appuser),27(sudo),100(users)
appuser:x:1002:1002:,,,:/home/appuser:/bin/bash
drwxr-x--- 3 appuser appuser 4096 Sep 24 05:42 /home/appuser
id: ‘devuser’: no such user

UID와 GID 숫자는 바꾸기 전과 같고, sudo 같은 보조 그룹도 그대로 유지된 것을 볼 수 있다. /home/devuser는 더 이상 존재하지 않아야 한다.

이전 이름이 남아 있는 곳 찾기

/etc 아래에서 이전 이름을 검색한다.

sudo grep -rn devuser /etc/ 2>/dev/null

실제로 실행해 보면 다음과 비슷한 결과가 나온다.

/etc/shadow-:36:devuser:$y$j9T$...:20720:0:99999:7:::
/etc/gshadow-:61:devuser:!::
/etc/group-:61:devuser:x:1002:
/etc/passwd-:38:appuser:x:1002:1002:,,,:/home/devuser:/bin/bash
/etc/subuid:3:devuser:231072:65536
/etc/subgid:3:devuser:231072:65536
/etc/subuid-:3:devuser:231072:65536
/etc/subgid-:3:devuser:231072:65536

여기서 두 종류를 구분해야 한다.

파일 의미 조치
이름이 -로 끝나는 파일 (passwd-, shadow-, group- 등) usermod, groupmod가 파일을 고치기 직전에 남기는 백업본 그대로 둔다. 다음 계정 변경 때 자동으로 덮어써진다
/etc/subuid, /etc/subgid 실제 설정 파일 직접 수정한다

/etc/passwd-에 appuser ... /home/devuser가 보이는 것도 이름만 바꾸고 홈을 옮기기 전 상태가 백업된 것이므로 정상이다.

/etc/subuid, /etc/subgid 수정하기

이 두 파일은 사용자에게 추가로 쓸 수 있는 UID·GID 범위를 할당해 둔 파일이다. rootless Docker·Podman 같은 컨테이너 도구가 컨테이너 안의 사용자를 이 범위에 대응시킬 때 사용한다. 이번 환경에서는 usermod -l이 이 파일을 갱신하지 않아 이전 이름이 그대로 남았다.

/etc/subuid의 한 줄은 사용자:시작UID:개수 형식이므로, 줄 맨 앞의 이름만 바꿔 준다.

sudo sed -i 's/^devuser:/appuser:/' /etc/subuid /etc/subgid
grep appuser /etc/subuid /etc/subgid

appuser:231072:65536 두 줄이 나오면 된다. 컨테이너 도구를 쓰지 않는 서버라면 당장 문제가 생기지는 않지만, 나중에 헷갈리지 않도록 함께 고쳐 두는 편이 낫다.


6. /etc 밖에서 확인할 곳

grep -rn /etc/로는 찾을 수 없지만, 이전 이름이나 /home/devuser 경로를 직접 적어 둔 곳도 확인해야 한다.

위치 확인할 내용
/etc/sudoers.d/* 사용자 이름으로 sudo 권한을 준 줄이 있다면 새 이름으로 수정 (visudo -f로 편집). 앞의 grep 결과에 함께 나온다
crontab sudo ls /var/spool/cron/crontabs/에 devuser 파일이 있다면 이름이 바뀌지 않은 것이다. 새 이름으로 옮기고, 예약 작업 속 경로도 확인한다
systemd 서비스 유닛 파일의 User=devuser, WorkingDirectory=/home/devuser/...
스크립트·설정 파일 /home/devuser/... 같은 절대 경로. grep -rn /home/devuser ~ 로 찾을 수 있다
가상 머신 디스크 이미지를 홈 디렉토리 아래에 두었다면 VM 설정의 디스크 경로 (virsh domblklist VM이름)
접속하는 쪽 PC ~/.ssh/config의 User devuser를 User appuser로 변경

crontab 파일은 다음과 같이 옮긴다.

sudo mv /var/spool/cron/crontabs/devuser /var/spool/cron/crontabs/appuser
sudo crontab -l -u appuser

7. 새 이름으로 로그인하고 정리하기

접속하는 PC에서 새 이름으로 로그인해 본다.

ssh appuser@서버주소
whoami       # appuser
pwd          # /home/appuser
sudo whoami  # root

홈 디렉토리를 통째로 옮겼기 때문에 ~/.ssh/authorized_keys도 함께 이동했다. 따라서 4번·11번 글처럼 공개키로 접속하던 서버라도 같은 키로 그대로 로그인된다.

모든 것이 정상이면 임시 관리자 계정을 삭제한다.

sudo userdel -r tempadmin

8. 명령어 정리

작업 명령
남은 프로세스 확인 ps -u 기존이름
남은 프로세스 종료 sudo pkill -u 기존이름
로그인 이름 변경 sudo usermod -l 새이름 기존이름
홈 디렉토리 이동 sudo usermod -d /home/새이름 -m 새이름
기본 그룹 이름 변경 sudo groupmod -n 새이름 기존이름
결과 확인 id 새이름, getent passwd 새이름
이전 이름 검색 sudo grep -rn 기존이름 /etc/
subuid·subgid 수정 sudo sed -i 's/^기존이름:/새이름:/' /etc/subuid /etc/subgid

9. 정리

사용자 이름 변경은 usermod -l로 로그인 이름을 바꾸고, usermod -d -m으로 홈 디렉토리를 옮기고, groupmod -n으로 기본 그룹 이름을 바꾸는 세 단계로 이루어진다. UID와 GID는 그대로 유지되므로 파일 소유권과 sudo 같은 보조 그룹 소속은 따로 손대지 않아도 된다.

변경은 반드시 바꾸려는 사용자가 아닌 다른 관리자 계정에서 해야 하며, 그 사용자의 프로세스가 모두 종료된 상태여야 한다. pkill -u로 프로세스를 정리할 때는 그 사용자로 실행 중이던 서비스나 VM도 함께 종료된다는 점에 주의한다.

변경 후에는 grep -rn 기존이름 /etc/로 남은 흔적을 찾는다. 이름이 -로 끝나는 파일은 자동 백업이므로 무시하고, /etc/subuid, /etc/subgid, sudoers, crontab, 스크립트 속 경로처럼 이전 이름을 직접 참조하는 곳을 새 이름으로 고친다.