쉘 스크립트로 시스템 사용자 DNS 조회 자동화하기
쉘 스크립트로 /etc/passwd의 사용자 계정을 추출하고 DNS 조회를 자동화하는 방법과 운영 개선점을 정리한다.
2026-08-14 · 최초 발행 2025-06-28
/etc/passwd를 순회하며 DNS를 질의하는 스크립트
시스템 계정 목록을 바탕으로 DNS 응답을 확인해야 할 때, /etc/passwd의 각 행을 순회하는 방식으로 작업을 자동화할 수 있다. 다음 스크립트는 행 번호를 증가시키면서 각 행을 DNS 질의에 전달한다.
index=1
while [ ${index} -le `cat /etc/passwd | wc -l` ];
do
dig `cat /etc/passwd | sed $index\!d` @192.168.100.154
index=$((index + 1))
done
/etc/passwd에는 리눅스·유닉스 시스템의 사용자 계정 정보가 행 단위로 저장된다. 이 구조를 순회해 DNS 조회를 실행하면 시스템 관리나 네트워크 진단 과정에서 반복 작업을 줄일 수 있다.
행 번호로 파일을 읽고 다음 대상로 이동하는 방식
초기값은 첫 번째 행을 가리키도록 설정한다.
index=1
쉘 변수는 = 기호 주변에 공백을 두지 않는다. index는 이후 루프마다 증가하며 /etc/passwd의 다음 행을 가리킨다.
반복 조건은 현재 행 번호와 파일의 전체 행 수를 비교한다.
while [ ${index} -le `cat /etc/passwd | wc -l` ];
cat /etc/passwd | wc -l은 파일의 줄 수를 계산한다. [ ${index} -le ... ] 조건은 index가 그 값보다 작거나 같은 동안 실행되며, -le는 less than or equal을 뜻하는 비교 연산자다. 백틱은 명령 실행 결과를 치환하는 데 사용한다.
루프 안에서는 현재 행을 꺼내 DNS 서버에 질의한 뒤 인덱스를 올린다.
do
dig `cat /etc/passwd | sed $index\!d` @192.168.100.154
index=$((index + 1))
done
sed $index\!d는 현재 index 번째 행을 제외한 나머지 행을 삭제해 해당 행만 남긴다. \!는 부정 연산자를 이스케이프한 표현이다. dig는 Domain Information Groper의 약자로 DNS 조회에 쓰이며, @192.168.100.154는 질의할 DNS 서버 IP 주소다. $((...))는 산술 연산 문법이다.
운영 환경에서 보완할 부분
기본 스크립트는 /etc/passwd의 한 줄 전체를 DNS 질의 인자로 사용한다. 하지만 각 행에는 사용자 이름뿐 아니라 UID와 GID 같은 정보도 함께 있으므로, DNS 조회가 실패할 수 있다. 사용자 이름만 잘라 전달하는 편이 낫다.
index=1
while [ ${index} -le `cat /etc/passwd | wc -l` ];
do
username=$(cat /etc/passwd | sed $index\!d | cut -d: -f1)
dig ${username} @192.168.100.154
index=$((index + 1))
done
cut -d: -f1은 콜론으로 구분된 첫 번째 필드, 즉 사용자 이름을 추출한다.
반복할 때마다 파일 전체를 다시 읽는 것도 부담이 된다. 줄 수를 한 번만 구하고, 필요한 행을 직접 선택하도록 바꿀 수 있다.
passwd_lines=$(cat /etc/passwd | wc -l)
for index in $(seq 1 $passwd_lines);
do
username=$(sed -n "${index}p" /etc/passwd | cut -d: -f1)
dig ${username} @192.168.100.154
done
여기서는 sed -n "${index}p"로 지정한 행만 출력한다.
사용자가 많은 시스템에서는 순차 DNS 조회가 오래 걸릴 수 있다. 다음처럼 xargs -P 10으로 최대 10개의 병렬 프로세스를 사용할 수 있다.
cat /etc/passwd | cut -d: -f1 | xargs -P 10 -I {} dig {} @192.168.100.154
계정 검증과 DNS 점검에 쓰는 경우
이 방식은 시스템에 등록된 계정이 DNS에 올바르게 등록됐는지 확인하는 데 활용할 수 있다. LDAP나 Active Directory처럼 중앙 집중식 인증 시스템과 연동된 환경에서도 점검 대상 목록을 만들 때 쓸 수 있다.
계정명을 기준으로 DNS 조회가 정상 동작하는지 확인하면 네트워크 구성 문제를 진단하는 단서가 된다. 시스템에 존재하는 모든 계정의 DNS 정보를 모아 보안 감사 자료로 활용하는 경우도 있다.
로그와 결과 요약을 포함한 운영용 예시
운영 환경에서는 질의 대상과 결과를 남기고, 작업 종료 뒤 성공·실패 건수를 확인할 수 있어야 한다. 다음 예시는 임시 파일, 병렬 처리, 로그 기록, 결과 요약을 함께 사용한다.
#!/bin/bash
# 설정 변수
DNS_SERVER="192.168.100.154"
MAX_PARALLEL=10
LOG_FILE="/var/log/user_dns_check_$(date +%Y%m%d).log"
# 로그 함수
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}
# 시작 메시지
log_message "사용자 DNS 조회 시작"
# 임시 파일 생성
TEMP_FILE=$(mktemp)
cut -d: -f1 /etc/passwd > $TEMP_FILE
# 총 사용자 수
TOTAL_USERS=$(wc -l < $TEMP_FILE)
log_message "총 ${TOTAL_USERS}명의 사용자에 대해 DNS 조회를 수행합니다."
# 병렬 처리로 DNS 조회 수행
cat $TEMP_FILE | xargs -P $MAX_PARALLEL -I {} bash -c "dig {} @$DNS_SERVER +short | grep -q . && echo '{}: 성공' || echo '{}: 실패'" | tee -a $LOG_FILE
# 결과 요약
SUCCESS=$(grep -c "성공" $LOG_FILE)
FAILURE=$(grep -c "실패" $LOG_FILE)
log_message "조회 완료: 성공 $SUCCESS, 실패 $FAILURE"
# 임시 파일 삭제
rm $TEMP_FILE
log_message "스크립트 실행 완료"
이 버전은 작업과 결과를 로그 파일에 남기고, 여러 DNS 조회를 동시에 실행하며, 성공과 실패를 요약한다. 임시 파일을 사용해 대규모 시스템에서도 안정적으로 동작하도록 구성했다.