리눅스 서버를 운영하다 보면 사용자 계정을 생성하고 관리하는 일이 반복적으로 발생합니다. 특히 교육용 서버, 개발 테스트 환경, 또는 다수의 인원이 협업하는 프로젝트에서는 수십 명의 계정을 빠르게 생성하고, 필요 시 삭제하거나 권한을 조정해야 할 일이 빈번합니다. 이 글에서는 사용자 계정 생성뿐 아니라 삭제, 조회까지 자동화할 수 있는 통합 스크립트를 소개합니다.
1단계 글에서 부족한 부분을 아래 해당되는 내용으로 수정본 구성하였습니다.
포스팅 목차
계정 관리, 왜 자동화해야 할까?
수동으로 useradd, passwd, usermod, userdel 명령어를 반복하는 것은 시간이 오래 걸릴 뿐 아니라 실수의 여지도 큽니다. 특히 비밀번호를 직접 설정하거나 sudo 권한을 부여할 때 오타나 누락이 발생하면 보안상 큰 문제가 될 수 있습니다. 자동화된 스크립트를 사용하면 다음과 같은 장점이 있습니다
- 사용자 수에 따라 반복 작업을 자동 처리
- 비밀번호를 무작위로 생성하여 보안 강화
- sudo 권한 여부를 선택적으로 부여
- 생성된 사용자 정보를 백업 파일로 저장
- 계정 삭제 시 안전하게 확인 및 처리
- 현재 사용자 및 그룹 목록을 조회하여 관리 상태 파악
통합 사용자 관리 스크립트의 구성
이 스크립트는 다음과 같은 기능을 제공합니다:
- 사용자 생성
- 사용자 수를 입력받아 루프를 돌며 계정 생성
- 아이디, 그룹명, sudo 권한 여부를 직접 입력
- 비밀번호는 영문 대소문자, 숫자, 특수문자를 포함한 10자리 무작위 생성
- 그룹이 존재하지 않으면 자동 생성
- 생성된 사용자 정보는 텍스트 파일로 백업
- 사용자 삭제
- 현재 시스템에 존재하는 일반 사용자 목록을 출력
- 삭제할 사용자 아이디를 입력받아 존재 여부 확인
- 삭제 전 사용자에게 확인을 요청하여 실수 방지
- userdel -r 명령어로 홈 디렉토리까지 안전하게 삭제
- 사용자 목록 조회
- /etc/passwd 파일에서 UID가 1000 이상인 일반 사용자만 필터링
- 시스템 계정(nobody, daemon 등)은 제외
- 그룹 목록 조회
- /etc/group 파일에서 전체 그룹명을 출력
- 그룹 구성 상태를 빠르게 파악 가능
스크립트 실행 흐름
스크립트를 실행하면 다음과 같은 메뉴가 출력됩니다
사용자 관리 작업을 선택하세요:
1) 사용자 생성
2) 사용자 삭제
3) 사용자 목록 조회
4) 그룹 목록 조회
사용자는 원하는 작업 번호를 입력하면 해당 기능이 실행됩니다. 예를 들어 1
을 입력하면 사용자 생성 루틴으로 넘어가고, 2
를 입력하면 삭제 루틴이 실행됩니다.
비밀번호 생성 방식
보안 강화를 위해 비밀번호는 urandom
을 활용하여 다음과 같이 생성됩니다
password=$(tr -dc 'A-Za-z0-9!@#$%^&*' </dev/urandom | head -c 10)
이 방식은 특수문자를 포함한 10자리의 강력한 비밀번호를 생성하며, 사람이 직접 입력하지 않기 때문에 예측 가능성이 낮습니다. 생성된 비밀번호는 백업 파일에 저장되므로 초기 로그인 후 사용자에게 전달하거나, 비밀번호 변경을 강제할 수 있습니다.
백업 파일 관리
스크립트는 사용자 정보를 다음 형식으로 백업합니다
아이디: test1 | 비밀번호: Ab3#xYz9!Q | 그룹: dev | sudo 권한 있음
백업 파일은 user_backup_날짜_시간.txt 형식으로 저장되며, 민감한 정보를 포함하므로 다음 명령어로 권한을 제한하는 것이 좋습니다.
#!/bin/bash
BACKUP_FILE="user_backup_$(date +%Y%m%d_%H%M%S).txt"
# 사용자 전체 조회 함수
list_users() {
echo "현재 시스템 사용자 목록:"
awk -F: '$3 >= 1000 && $1 != "nobody" { print $1 }' /etc/passwd
}
# 그룹 전체 조회 함수
list_groups() {
echo "현재 시스템 그룹 목록:"
cut -d: -f1 /etc/group
}
# 사용자 생성 함수
create_users() {
read -p "생성할 사용자 수를 입력하세요: " USER_COUNT
for ((i=1; i<=USER_COUNT; i++)); do
echo "[$i/$USER_COUNT] 사용자 정보를 입력하세요."
read -p "아이디: " username
read -p "부여할 그룹명 (없으면 엔터): " group
read -p "sudo 권한 부여? (yes/no): " sudo
password=$(tr -dc 'A-Za-z0-9!@#$%^&*' </dev/urandom | head -c 10)
if [ -n "$group" ]; then
if ! getent group "$group" > /dev/null; then
groupadd "$group"
echo "그룹 '$group' 생성됨."
fi
useradd -m -g "$group" "$username"
else
useradd -m "$username"
fi
echo "$username:$password" | chpasswd
if [ "$sudo" == "yes" ]; then
usermod -aG sudo "$username"
sudo_status="sudo 권한 있음"
else
sudo_status="sudo 권한 없음"
fi
echo "아이디: $username | 비밀번호: $password | 그룹: ${group:-없음} | $sudo_status" >> "$BACKUP_FILE"
echo "사용자 '$username' 생성 완료"
done
echo "모든 사용자 생성이 완료되었습니다."
echo "사용자 정보 백업 파일: $BACKUP_FILE"
}
# 사용자 삭제 함수
delete_user() {
echo "삭제 가능한 사용자 목록:"
awk -F: '$3 >= 1000 && $1 != "nobody" { print $1 }' /etc/passwd
read -p "삭제할 사용자 아이디를 입력하세요: " target
if id "$target" &>/dev/null; then
read -p "'$target' 계정을 정말 삭제하시겠습니까? (yes/no): " confirm
if [ "$confirm" == "yes" ]; then
userdel -r "$target"
echo "사용자 '$target' 삭제 완료"
else
echo "삭제 취소됨"
fi
else
echo "사용자 '$target'는 존재하지 않습니다."
fi
}
# 메뉴 선택
echo "사용자 관리 작업을 선택하세요:"
echo "1) 사용자 생성"
echo "2) 사용자 삭제"
echo "3) 사용자 목록 조회"
echo "4) 그룹 목록 조회"
read -p "번호 입력: " choice
case "$choice" in
1) create_users ;;
2) delete_user ;;
3) list_users ;;
4) list_groups ;;
*) echo "잘못된 선택입니다." ;;
esac
실무 적용 팁
- 교육용 서버에서는 계정 생성 후
chage -d 0
명령어로 비밀번호 변경을 강제할 수 있습니다. - 협업 환경에서는 그룹을 활용해 파일 접근 권한을 제어하고,
umask
나ACL
설정을 통해 세부 권한을 조정할 수 있습니다. - 삭제 기능은 실수 방지를 위해 반드시 사용자 목록을 먼저 출력하고, 삭제 전 확인을 받도록 설계되어 있습니다.
마무리
리눅스 사용자 계정 관리는 단순한 명령어 입력을 넘어서, 체계적인 접근이 필요합니다. 이 통합 스크립트는 계정 생성부터 삭제, 조회까지 한 번에 처리할 수 있어 실무 환경에서 매우 유용합니다. 반복 작업을 줄이고, 보안과 정확성을 높이고 싶다면 이 스크립트를 활용해보세요.
스크립트는 필요에 따라 SSH 키 등록, 로그인 제한, 비밀번호 만료 설정 등으로 확장할 수 있습니다. 사용자 관리가 필요한 모든 환경에서 이 자동화 스크립트는 강력한 도구가 되어줄 것입니다.