CV.sh: 쉘 스크립트를 활용한 시스템 사용자 DNS 조회 자동화
CV.sh: 쉘 스크립트를 활용한 시스템 사용자 DNS 조회 자동화
쉘 스크립트는 시스템 관리자의 필수 도구로, 반복적인 작업을 자동화하여 효율성을 크게 향상시킵니다. 오늘 분석할 CV.sh 스크립트는 시스템 사용자 계정에 대한 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 조회를 수행합니다. 시스템 관리 및 네트워크 진단 측면에서 중요한 자동화 도구입니다.
스크립트 구성 요소 분석
1. 변수 초기화
index=1
- 'index' 변수를 1로 초기화하여
/etc/passwd
파일의 첫 번째 줄부터 처리를 시작합니다. - 쉘 스크립트에서는 변수 선언 시 '=' 기호 앞뒤에 공백이 없어야 함에 주의해야 합니다.
2. while 루프 조건
while [ ${index} -le `cat /etc/passwd | wc -l` ];
cat /etc/passwd | wc -l
:/etc/passwd
파일의 총 줄 수를 계산합니다.cat
: 파일 내용을 표준 출력으로 내보냅니다.wc -l
: 입력된 텍스트의 줄 수를 계산합니다.
[ ${index} -le ... ]
: index 변수가 파일의 총 줄 수보다 작거나 같은지 비교합니다.-le
: 'less than or equal'의 약자로 '≤' 비교 연산을 수행합니다.
- 백틱(`)을 사용하여 명령어 실행 결과를 변수에 저장합니다.
3. 루프 본문
do
dig `cat /etc/passwd | sed $index\!d` @192.168.100.154
index=$((index + 1))
done
sed $index\!d
:/etc/passwd
파일에서 현재 index에 해당하는 줄만 추출합니다.sed
: 스트림 편집기로, 텍스트 변환 작업을 수행합니다.$index\!d
: index 번째 줄을 제외한 모든 줄을 삭제하는 sed 명령어입니다.\!
는 부정 연산자를 이스케이프 처리한 것입니다.
dig ... @192.168.100.154
: 추출된 사용자 정보로 DNS 조회를 수행합니다.dig
: Domain Information Groper의 약자로, DNS 조회 도구입니다.@192.168.100.154
: 조회할 DNS 서버의 IP 주소를 지정합니다.
index=$((index + 1))
: 다음 줄을 처리하기 위해 인덱스를 증가시킵니다.$((...))
: 쉘 스크립트에서 산술 연산을 수행하는 문법입니다.
스크립트의 문제점 및 개선 방안
1. 전체 사용자 정보를 DNS 조회에 사용
현재 스크립트는 /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
을 사용하여 사용자 이름만 추출합니다.
2. 비효율적인 파일 접근
스크립트는 매 반복마다 /etc/passwd
파일을 다시 읽어들입니다. 이는 불필요한 디스크 I/O를 발생시켜 성능을 저하시킵니다.
개선 방안:
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"
를 사용하여 특정 줄을 직접 추출합니다.
3. 병렬 처리 부재
현재 스크립트는 순차적으로 DNS 조회를 수행합니다. 사용자가 많은 시스템에서는 실행 시간이 길어질 수 있습니다.
개선 방안:
cat /etc/passwd | cut -d: -f1 | xargs -P 10 -I {} dig {} @192.168.100.154
xargs -P 10
을 사용하여 최대 10개의 병렬 프로세스로 DNS 조회를 수행합니다.
실제 적용 사례
이러한 스크립트는 다음과 같은 상황에서 유용하게 활용될 수 있습니다:
1. 사용자 계정 검증
시스템에 등록된 사용자 계정이 DNS에 올바르게 등록되어 있는지 확인합니다. 특히 LDAP, Active Directory와 같은 중앙 집중식 인증 시스템과 연동된 환경에서 유용합니다.
graph LR
A[시스템 사용자] --> B[CV.sh 스크립트]
B --> C[DNS 서버]
C --> D[사용자 검증 결과]
D --> E[관리자 보고서]
2. 네트워크 진단
사용자 계정 이름을 기반으로 DNS 조회가 제대로 작동하는지 확인하여 네트워크 구성 문제를 진단합니다.
3. 보안 감사
시스템에 등록된 모든 사용자 계정에 대한 DNS 정보를 수집하여 보안 감사 자료로 활용합니다.
graph TD
A[CV.sh 실행] --> B[사용자별 DNS 조회]
B --> C{조회 성공?}
C -->|Yes| D[정상 사용자]
C -->|No| E[이상 사용자]
D --> F[보고서 생성]
E --> F
고급 개선 버전
실제 운영 환경에서 사용할 수 있는 보다 견고한 스크립트는 다음과 같습니다:
#!/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 조회를 동시에 수행하여 실행 시간을 단축합니다.
- 결과 요약: 성공 및 실패한 조회 수를 요약하여 보고합니다.
- 임시 파일 사용: 메모리 효율성을 높이고 대규모 시스템에서도 안정적으로 동작합니다.
결론
CV.sh 스크립트는 시스템 사용자에 대한 DNS 조회를 자동화하는 간단하지만 강력한 도구입니다. 기본 버전은 작동하지만, 실제 운영 환경에서는 효율성과 안정성을 위해 개선된 버전을 사용하는 것이 좋습니다. 쉘 스크립트의 강점은 복잡한 시스템 작업을 자동화하여 시간을 절약하고 오류를 줄일 수 있다는 점입니다. 이러한 자동화 도구는 시스템 관리자와 네트워크 엔지니어의 필수 도구로 자리 잡고 있습니다.
Keywords
Shell Script, 쉘 스크립트, DNS Lookup, DNS 조회, /etc/passwd, System Administration, 시스템 관리, Automation, 자동화, sed, dig, Bash