서버관리_02 서버에 작성된 사용자 계정 목록 얻기(Server Get User List)

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: grep, cut
키워드: 사용자 계정, 구분자, 컬럼
사용처: 텍스트 파일에서 구분자를 지정해서 특정 컬럼을 추출하고 싶을 때

  • 실행예제
$ ./sep-cut.sh
root
bin
daemon
  :(생략)
sshd
nginx
user1

스크립트

#!/bin/bash

# 사용자 계정 정보 파일
filename="/etc/passwd"

# 줄 첫글자가 #인 주석 줄은 제외하고 cut 명령어로
# * 첫 번째 값을 표시 [-f 1]
# * 구분자 기호는 : [-d ":"]로 표시
grep -v "^#" "$filename" | cut -f 1 -d ":" # --------------------- 1

해설

이 스크립트는 유닉스의 시스템 사용자 계정 정보가 적힌 /etc/passwd 파일에서 시스템에 존재하는 계정 목록을 표시합니다. 서버를 구축하고 운용할 때 어떤 사용자가 이미 작성되어 있는지 확인할 때 사용할 수 있습니다.

/etc/passwd 파일은 사용자 관리에 사용하는 시스템 파일로 다음과 같은 형식입니다.

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
...(생략)

/etc/passwd 파일내용은 :(콜론) 으로 나뉘는데 각 항목은 아래와 같습니다.

  • 각 칼럼의 의미

    컬럼 설명
    컬럼1 사용자명
    컬럼2 암호
    컬럼3 UID(사용자ID)
    컬럼4 GID(그룹ID)
    컬럼5 코멘트(풀네임이 들어가기도 함)
    컬럼6 홈 디렉토리 경로
    컬럼7 로그인 쉘

사용자 계정과 UID를 취득하기 위해 /etc/passwd 파일을 사용하는 명령어가 많습니다. 이 예제는 /etc/passwd 파일의 컬럼1에서 사용자 목록을 취득합니다.

파일 예에서 봤듯 /etc/passwd 파일 구분자는 :(콜론)입니다. 이런 텍스트 파일에서 지정한 컬럼값을 추출하려면 ‘구분자를 지정해서 n번째 값을 추출’하는 명령어로 대응할 수 있습니다. 몇가지 방법이 있지만 예제에서는 cut 명령어를 사용합니다.

cut 명령어는 텍스트 파일에서 어떤 부분을 잘라내는 명령어입니다. -f 옵션을 사용해서 n번째 값만 표시할 수 있습니다. cut 명령어는 기본 구분자 기호가 탭이므로 1 에서 구분자 문자를 변경하는 -d 옵션을 동시에 이용합니다. -d “:”라고 지정하면 :(콜론)을 구분자로 지정 가능하므로 -f 1로 첫 번째 값 즉, 사용자 명을 추출할 수 있습니다.

그리고 FreeBSD의 /etc/passwd 파일에는 #로 시작하는 주석 줄이 포함되어 있습니다. 따라서 cut 명령어에 넘기기 전에 grep 명령어로 일치하지 않는 줄을 표시하는 -v 옵션을 사용해서 #로 시작하는 줄(^#)을 제외 합니다.

/etc/passwd 파일과 암호

현대의 유닉스에서는 보안 관점에서 /etc/passwd 파일에는 암호를 기록하지 않고 대신에 리눅스라면 /etc/shadow, FreeBSD라면 /etc/master.passwd에 암호화한 암호를 기록합니다. 이런 파일은 root만 볼 수 있으므로 root가 되어서 파일 내용을 보면 다음과 같습니다.

  • 암호화된 암호가 적혀 있음.
    # cat /etc/shadow
    root:$6$syp8C9Kv4Y2MkPXf$Q2iRWpMfw9hNcEyPT5bp8vkq2cKAasuNFb0E/ryMuzPFLjhwN2XuOV6ONB3WAhGfi3eWEVZcBqCk38puOJeSM1:19474:0:99999:7:::
    daemon:*:19467:0:99999:7:::
    bin:*:19467:0:99999:7:::
    daemon:*:15628:0:99999:7:::
    ...(생략)
    

여기에서는 예를 들어 $6$로 시작하는 긴 문자열이 암호화된 암호입니다. 예전 유닉스는 /etc/passwd 파일에 그 값을 직접 기록했지만 악의적인 사용자가 다른 사용자의 암호를 무작위 대입 공격으로 취득할 수도 있으므로 요즘은 암호 파일을 root만 볼 수 있는 구조로 바뀌었습니다.

한편 Mac은 /etc/passwd 파일을 직접 사용자 관리에 사용하지 않으므로 /etc/master.passwd 파일은 존재하지만 암호화된 암호 자체는 기록되어 있지 않습니다.

주의사항

  • Mac에도 /etc/passwd 파일이 존재하지만 일반 로그인 사용자는 디렉터리 서비스로 따로 관리하고 있어 이런 /etc/passwd 파일에는 일반 로그인에 사용하는 계정이 존재하지 않습니다. 하지만 다른 시스템 계정은 /etc/passwd에 존재하므로 예제 실행에 문제는 없습니다.
  • 콜론이 구분자인 텍스트 파일에서 일부 컬럼을 추출하려면 awk 명령어 구분자를 지정하는 -F 옵션을 사용해서 다음처럼 작성합니다.
    awk -F: '{print $1}'
    

하지만 cut 명령어를 사용하는 예가 더 짧고 알기 쉽습니다.