[Linux 셸 스크립트] 서버 관리 - 105 서버에 작성된 사용자 계정 목록 얻기
본문 바로가기
IT 이야기/Linux 셸 스크립트

[Linux 셸 스크립트] 서버 관리 - 105 서버에 작성된 사용자 계정 목록 얻기

by 찬찬이 아빠 2021. 4. 22.
반응형
  1. 사용 명령어

(1) grep

(2) cut

 

 

  2. 키워드 & 사용처

(1) 키워드

사용자 계정, 구분자, 컬럼

 

(2) 사용처

텍스트 파일에서 구분자를 지정해서 특정 컬럼을 추출하고 싶을 때 사용합니다.

 

 

  3. 실행 예제
$ ./sep-cut.sh
root
bin
daemon
... 생략 ...
sshd
nginx
park

 

 

  4. 스크립트

#!/bin/sh

 

# 사용자 계정 정보 파일

filename="/etc/passwd"

 

# 줄 첫 글자가 #인 주석 줄은 제외하고 cut 명령어로

# * 첫 번째 값을 표시 [-f 1]

# * 구분자 기호는 " [-d ":"]로 표시

grep -v "^$" "$filename" | cut -f 1 -d ":"

 

 

  5. 해설

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

 

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

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
... 생략 ...
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
nginx:x:498:499:Nginx web server:/var/lib/nginx:/sbin/nologin
park:x:501:501::/home/park:/bin/bash

 

/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 명령어는 기본 구분자 기호가 탭이므로 에서 구분자 문자를 변경하는 -d 옵션을 동시에 이용합니다. -d ":"라고 지정하면 :(콜론)을 구분자로 지정 가능하므로 -f 1로 첫 번째 값 즉, 사용자명을 추출할 수 있습니다.

 

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

 

 

  6. /etc/passwd 파일과 암호

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

# cat /etc/shadow
root:$6$OBO7CUwM$8hKvfUcySRdXKu6.aFF0qlLAxUL6WTPkvg6myrcl.RKdxfPlfYbr3SEs81k2l1JrYpruxhiRTirfbMTVRz0oB0:16032:0:99999:7:::
bin:*:15628: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 명령어를 사용하는 예가 더 짧고 알기 쉽습니다.

 

 

 

참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전

반응형

댓글