Red Hat Certified System Administrator (RHCSA) #2 필수 도구: bash, vi, redirection, find/grep, archive, ssh

11 분 소요

#1 시험 소개에서 EX200의 형식과 응시 환경을 잡았다면, 이제 모든 작업의 토대가 되는 셸 기본기로 들어갑니다. RHCSA는 빈 셸 앞에서 제한 시간 안에 작업을 끝내는 실기 시험이고, 그 속도를 가르는 것이 바로 이번 글에서 다루는 도구들입니다. 사용자 관리도, LVM 확장도, SELinux 수정도 결국 셸에서 명령을 치고 결과를 확인하는 일이므로, redirection과 find, grep, vi가 손에 붙어 있어야 나머지 영역이 빨라집니다.

특히 시험장에는 인터넷이 없습니다. Stack Overflow도 블로그도 볼 수 없으므로, find의 옵션 하나를 떠올리지 못하면 man page를 빠르게 뒤지는 수밖에 없습니다. 이번 글은 자주 쓰는 도구를 손에 익히는 동시에, 막혔을 때 man page에서 답을 찾는 습관까지 함께 잡겠습니다.

입출력 redirection과 파이프 #

셸의 모든 명령에는 표준 입력(stdin, 0번),표준 출력(stdout, 1번),표준 오류(stderr, 2번)라는 세 개의 통로가 있습니다. redirection은 이 통로를 파일이나 다른 명령으로 돌리는 기능이고, RHCSA에서는 명령 결과를 파일로 저장하거나 오류만 따로 걸러낼 때 끊임없이 씁니다.

# 표준 출력을 파일로 (덮어쓰기)
ls -l /etc > /tmp/etc-list.txt

# 표준 출력을 파일에 이어 붙이기 (append)
date >> /tmp/etc-list.txt

# 표준 오류만 파일로 (2번)
find / -name "*.conf" 2> /tmp/errors.txt

# 표준 출력과 표준 오류를 함께 한 파일로
find / -name "*.conf" &> /tmp/all.txt
find / -name "*.conf" > /tmp/all.txt 2>&1

# 오류를 버리기 (권한 없는 디렉터리 경고 무시)
find / -name "passwd" 2> /dev/null

>는 기존 내용을 덮어쓰고 >>는 끝에 이어 붙입니다. 둘을 헷갈리면 작업 파일을 통째로 날릴 수 있으니, 누적해야 할 때는 반드시 >>를 씁니다. 표준 오류를 /dev/null로 보내면 권한 없는 디렉터리에서 나오는 경고를 화면에서 치울 수 있습니다.

파이프(|)는 한 명령의 출력을 다음 명령의 입력으로 넘깁니다. 여러 도구를 연결해 한 줄로 작업을 끝내는 것이 셸의 핵심입니다.

# 로그인 셸이 bash인 사용자만 세기
grep "/bin/bash$" /etc/passwd | wc -l

# 프로세스를 메모리 사용량 순으로 상위 5개
ps aux | sort -k4 -rn | head -5

tee는 출력을 파일에 저장하면서 동시에 화면에도 보여 줍니다. 명령 결과를 확인하면서 기록까지 남길 때 유용합니다.

# 화면에 보이면서 파일에도 저장
ls -l /var/log | tee /tmp/log-list.txt

# sudo 권한이 필요한 파일에 쓰기 (리다이렉션은 셸 권한이라 sudo가 안 먹힘)
echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/99-fwd.conf

마지막 예시는 RHCSA에서 자주 막히는 부분입니다. sudo echo ... > /etc/... 형태는 redirection 자체를 일반 권한 셸이 처리하므로 권한 오류가 납니다. 이때 sudo tee를 쓰면 파일 쓰기 단계가 root로 실행되어 해결됩니다.

find: 조건에 맞는 파일 찾기 #

RHCSA의 단골 유형은 “특정 조건을 만족하는 파일을 찾아 어딘가로 복사하거나 권한을 바꾸라"입니다. find는 이 작업의 중심 도구이므로 옵션을 손에 익혀 둡니다.

# 이름으로 찾기 (대소문자 구분 / 무시)
find /etc -name "*.conf"
find /etc -iname "*.CONF"

# 종류로 찾기 (f=파일, d=디렉터리, l=심볼릭링크)
find /var -type d -name "log"

# 크기로 찾기 (+10M=10MB 초과, -1k=1KB 미만)
find /var -type f -size +10M

# 수정 시각으로 찾기 (-mtime -7=최근 7일 이내, +30=30일 이전)
find /home -type f -mtime -7

# 권한으로 찾기 (정확히 일치)
find / -type f -perm 4000 2> /dev/null

# 소유자 / 그룹으로 찾기
find /home -user alice
find /home -group developers

-size의 단위는 c(바이트),k,M,G이고, 앞에 +를 붙이면 초과, -를 붙이면 미만, 부호가 없으면 정확히 그 크기를 뜻합니다. -mtime의 숫자도 같은 방식으로 -n은 최근 n일 이내, +n은 n일 이전을 가리킵니다.

권한 검색은 RHCSA에서 특히 자주 나옵니다. SUID 파일을 찾으라는 문제는 -perm 4000이 아니라 -perm -4000을 써야 정확합니다. 앞에 -를 붙이면 “해당 비트를 포함하는” 모든 파일이 잡히기 때문입니다.

# SUID 비트가 설정된 모든 파일 (포함 검색)
find / -type f -perm -4000 2> /dev/null

# 그룹과 기타에게 쓰기 권한이 있는 파일
find /var -type f -perm -022

찾은 파일에 곧바로 작업을 거는 -exec가 가장 강력합니다. {}는 찾은 각 파일로 치환되고, \;로 명령을 끝맺습니다.

# 찾은 .conf 파일을 모두 /tmp/backup으로 복사
find /etc -name "*.conf" -exec cp {} /tmp/backup/ \;

# 특정 사용자 소유 파일의 권한을 일괄 변경
find /shared -user bob -exec chmod 640 {} \;

# 실행 전에 확인을 받으며 삭제 (-ok)
find /tmp -name "*.tmp" -ok rm {} \;

“alice가 소유한 파일을 모두 찾아 /root/alice-files로 복사하라” 같은 문제는 find /home -user alice -exec cp {} /root/alice-files/ \; 한 줄로 끝납니다. 이 패턴을 손에 익혀 두면 비슷한 문제를 빠르게 풉니다.

grep: 텍스트 안에서 찾기 #

grep은 파일이나 출력에서 패턴에 맞는 줄을 골라냅니다. 로그를 뒤지고 설정 파일을 확인하는 거의 모든 작업의 출발점입니다.

# 기본 검색
grep "root" /etc/passwd

# 대소문자 무시 (-i)
grep -i "error" /var/log/messages

# 디렉터리 전체를 재귀 검색 (-r)
grep -r "PermitRootLogin" /etc/ssh/

# 일치하지 않는 줄만 (-v). 주석과 빈 줄 제거에 자주 씀
grep -v "^#" /etc/ssh/sshd_config | grep -v "^$"

# 줄 번호 표시 (-n)
grep -n "listen" /etc/httpd/conf/httpd.conf

매치된 줄의 앞뒤 맥락을 함께 보려면 -A(after),-B(before),-C(context)를 씁니다. 로그에서 오류 전후를 살필 때 유용합니다.

# 매치 줄과 그 뒤 3줄
grep -A 3 "Failed password" /var/log/secure

# 매치 줄과 그 앞 2줄
grep -B 2 "error" /var/log/messages

# 매치 줄과 앞뒤 각 5줄
grep -C 5 "denied" /var/log/audit/audit.log

확장 정규식은 -E로 켭니다. 정규식의 기초만 알아도 검색이 훨씬 정확해집니다. ^는 줄의 시작, $는 줄의 끝, .은 임의의 한 글자, *는 앞 글자의 0회 이상 반복, [abc]는 문자 집합을 뜻합니다.

# bash로 끝나는 줄 (줄 끝 앵커)
grep "bash$" /etc/passwd

# 빈 줄 (시작과 끝 사이에 아무것도 없음)
grep -c "^$" /etc/ssh/sshd_config

# 확장 정규식: error 또는 warn
grep -E "error|warn" /var/log/messages

# 숫자가 하나 이상 연속된 줄
grep -E "[0-9]+" /etc/hosts

텍스트 처리 도구 #

파일 내용을 보고 다듬는 도구들도 시험 작업의 곳곳에 등장합니다. less는 긴 파일을 페이지 단위로 넘겨 보고, 안에서 /패턴으로 검색하며 q로 빠져나옵니다. man page를 읽는 화면도 less라서 조작이 같습니다.

# 파일을 페이지 단위로 보기 (/패턴 검색, n 다음, q 종료)
less /var/log/messages

# 앞 / 뒤 일부만 보기
head -20 /etc/passwd
tail -20 /var/log/messages

# 로그를 실시간으로 따라가기 (-f)
tail -f /var/log/messages

sort는 정렬, wc는 줄,단어,바이트 수 세기, cut은 열 잘라내기에 씁니다.

# 사전순 / 숫자순 / 역순 정렬
sort /etc/passwd
sort -t: -k3 -n /etc/passwd   # : 구분, 3번째 필드를 숫자로

# 줄 수 / 단어 수 세기
wc -l /etc/passwd
grep -c "" /etc/passwd

# : 로 구분된 1번 필드(사용자명)만 뽑기
cut -d: -f1 /etc/passwd

# 고정 폭으로 자르기 (1번〜8번 글자)
cut -c1-8 /etc/passwd

sedawk는 한 줄짜리 변환에 강력합니다. RHCSA에서는 vi로 직접 고치는 편이 안전할 때가 많지만, 일괄 치환이나 특정 필드 추출에는 한 줄 명령이 빠릅니다.

# sed: 모든 줄에서 oldname을 newname으로 치환 (출력만)
sed 's/oldname/newname/g' /tmp/file.txt

# sed: 파일을 직접 수정 (-i), 원본은 .bak으로 백업
sed -i.bak 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config

# awk: 공백 구분 3번째 열만 출력
awk '{print $3}' /tmp/data.txt

# awk: : 구분, UID가 1000 이상인 사용자명 출력
awk -F: '$3 >= 1000 {print $1}' /etc/passwd

vi/vim: 시험에서 필수인 편집기 #

RHCSA에서는 설정 파일을 직접 고치는 작업이 끝없이 나오고, 그 편집은 거의 vi로 합니다. nano가 항상 설치되어 있다는 보장이 없으므로, vi의 기본 조작은 반드시 손에 익혀 두어야 합니다.

vi는 모드 기반 편집기입니다. 세 모드의 전환을 이해하는 것이 출발점입니다.

모드역할진입
일반 모드(Normal)이동,삭제,복사,붙여넣기Esc
입력 모드(Insert)글자 입력i, a, o
명령행 모드(Command-line)저장,종료,검색치환:

편집을 시작하고 저장한 뒤 빠져나오는 흐름은 다음과 같습니다.

vi /etc/ssh/sshd_config   # 파일 열기 (일반 모드로 시작)
i                          # 입력 모드 진입 (커서 위치부터 입력)
... 내용 수정 ...
Esc                        # 일반 모드로 복귀
:w                         # 저장
:q                         # 종료
:wq  또는  ZZ              # 저장하고 종료
:q!                        # 저장하지 않고 강제 종료

일반 모드의 자주 쓰는 조작도 외워 둡니다. dd는 한 줄 삭제, yy는 한 줄 복사, p는 붙여넣기, u는 실행 취소, gg는 파일 맨 위, G는 맨 아래, 숫자G는 해당 줄로 이동입니다.

검색과 치환은 시험에서 시간을 크게 아껴 줍니다. 일반 모드에서 /패턴으로 검색하고 n으로 다음 일치로 넘어갑니다. 명령행 모드의 치환은 다음 형식을 씁니다.

:%s/old/new/g     # 파일 전체에서 old를 new로 모두 치환
:%s/old/new/gc    # 치환할 때마다 확인을 받음
:10,20s/old/new/  # 10〜20번 줄에서만 치환
:set number       # 줄 번호 표시

“sshd_config에서 PermitRootLogin을 no로 바꾸라” 같은 문제는 vi로 열어 /PermitRootLogin으로 찾아 직접 고치거나, :%s/PermitRootLogin yes/PermitRootLogin no/로 한 번에 바꿀 수 있습니다.

archive: tar, gzip, bzip2 #

파일을 묶고 압축하는 작업도 출제 영역에 들어 있습니다. tar는 여러 파일을 하나로 묶고, 옵션에 따라 압축까지 함께 처리합니다. 옵션 글자의 뜻을 알면 조합이 쉽습니다. c는 생성, x는 풀기, t는 목록 보기, f는 파일명 지정, v는 진행 표시, z는 gzip, j는 bzip2, J는 xz 압축입니다.

# 디렉터리를 gzip 압축 아카이브로 묶기
tar czf /tmp/etc-backup.tar.gz /etc

# bzip2 압축으로 묶기
tar cjf /tmp/etc-backup.tar.bz2 /etc

# 아카이브 풀기 (gzip)
tar xzf /tmp/etc-backup.tar.gz -C /tmp/restore/

# 풀지 않고 내용 목록만 확인
tar tzf /tmp/etc-backup.tar.gz

압축 글자를 빼고 tar cf로 묶으면 압축 없는 단순 아카이브가 됩니다. 풀 때도 같은 압축 글자를 맞춰 주는 것이 원칙이지만, 최근 tar는 압축 형식을 자동 감지하므로 tar xf만으로도 대개 풀립니다. 단일 파일을 압축할 때는 gzipbzip2를 직접 쓰기도 합니다.

# 단일 파일 압축 / 해제 (원본을 .gz로 대체)
gzip /tmp/big.log          # → big.log.gz
gunzip /tmp/big.log.gz     # → big.log

# bzip2 (압축률이 더 높고 느림)
bzip2 /tmp/big.log
bunzip2 /tmp/big.log.bz2

ssh와 scp: 원격 작업 #

RHCSA 시험은 여러 시스템을 다루는 경우가 있어 ssh로 다른 호스트에 접속해 작업하는 일이 흔합니다. 기본 접속과 명령 실행은 다음과 같습니다.

# 다른 호스트에 접속
ssh user@server1

# 접속 없이 원격 명령만 실행하고 결과 받기
ssh user@server1 'hostname; uptime'

# 포트를 지정해 접속
ssh -p 2222 user@server1

비밀번호 없이 접속하려면 키 기반 인증을 설정합니다. 키 쌍을 만들고 공개 키를 대상 서버로 보내면 됩니다. 자세한 firewalld,SSH 키 설정은 #12에서 깊이 다루지만, 기본 흐름은 여기서 잡아 둡니다.

# 키 쌍 생성 (개인 키 ~/.ssh/id_ed25519, 공개 키 .pub)
ssh-keygen -t ed25519

# 공개 키를 대상 서버의 authorized_keys로 복사
ssh-copy-id user@server1

# 이후 비밀번호 없이 접속
ssh user@server1

파일 전송은 scprsync로 합니다. scp는 단순 복사, rsync는 변경분만 전송하므로 큰 디렉터리에 효율적입니다.

# 로컬 → 원격
scp /tmp/report.txt user@server1:/home/user/

# 원격 → 로컬
scp user@server1:/etc/hosts /tmp/

# 디렉터리 통째로 (-r)
scp -r /tmp/configs user@server1:/tmp/

# rsync: 변경분만, 아카이브 모드로 권한 보존 (-a)
rsync -av /tmp/configs/ user@server1:/tmp/configs/

man page 활용: 인터넷 없는 시험장의 무기 #

시험장에는 인터넷이 없습니다. 명령 옵션이 기억나지 않을 때 유일한 참고서가 man page이므로, 빠르게 찾는 습관이 곧 점수입니다. 키워드로 관련 man page를 찾을 때는 man -k(apropos)를 씁니다.

# 키워드로 관련 명령 찾기
man -k password
man -k "list directory"

# man을 열어 안에서 /EXAMPLE로 예시 찾기 (less 조작)
man find        # 연 뒤 /EXAMPLE 입력, n으로 다음

같은 이름이 여러 섹션에 존재할 때는 섹션 번호를 지정합니다. 1번은 사용자 명령, 5번은 파일 형식과 설정 파일, 8번은 관리자 명령입니다. 예컨대 passwd는 명령(1번)과 파일 형식(5번)이 모두 있습니다.

# passwd 명령 (1번 섹션)
man 1 passwd

# /etc/passwd 파일 형식 (5번 섹션)
man 5 passwd

# 설정 예시 파일이 모인 디렉터리 (시험에서 큰 도움)
ls /usr/share/doc/

/usr/share/doc 아래에는 패키지별 설정 예시가 들어 있습니다. autofs나 LVM처럼 설정 형식이 까다로운 작업에서 예시 파일을 복사해 고치면 시간을 크게 아낄 수 있습니다.

시험 단골: 조건에 맞는 파일을 찾아 처리하기 #

이번 글의 도구들이 한꺼번에 나오는 대표 유형이 “특정 조건의 파일을 찾아 어딘가로 복사하거나 묶으라"입니다. 몇 가지 패턴을 손에 익혀 두면 비슷한 문제가 나와도 막히지 않습니다.

# bob이 소유한 파일을 모두 찾아 /root/bob-files로 복사
mkdir -p /root/bob-files
find / -user bob -type f -exec cp {} /root/bob-files/ \; 2> /dev/null

# /etc에서 .conf로 끝나는 파일만 묶어 압축 아카이브로
find /etc -name "*.conf" -exec tar rf /tmp/confs.tar {} \;

# /var/log에서 최근 7일 안에 수정된 파일 목록을 저장
find /var/log -type f -mtime -7 > /tmp/recent-logs.txt

# messages 로그에서 error를 담은 줄만 뽑아 파일로
grep -i "error" /var/log/messages > /tmp/errors.txt

여기서도 영구성과 정확성을 늘 점검합니다. 복사 대상 디렉터리를 먼저 만들어 두었는지, 권한 없는 디렉터리의 경고를 2> /dev/null로 걸러 결과가 깔끔한지 확인하는 작은 습관이 실점을 막습니다.

시험 포인트 #

  • redirection의 구분. >는 덮어쓰기, >>는 이어 붙이기, 2>는 오류만, &>는 출력과 오류를 함께. sudo로 보호된 파일에 쓸 때는 sudo tee를 쓴다
  • find의 조건 결합. -name,-type,-size,-mtime,-perm,-user를 묶고, -exec ... {} \;로 곧바로 처리한다. SUID 검색은 -perm -4000
  • grep의 정규식과 맥락. -i,-r,-v,-E-A/-B/-C. 주석 제거는 grep -v "^#"
  • vi 필수 조작. 모드 전환, :wq,:q!, :%s/old/new/g 치환. nano가 없을 수 있으니 vi로 익힌다
  • tar 옵션 조합. czf로 묶고 xzf로 풀며 tzf로 목록을 본다
  • ssh와 scp. ssh-copy-id로 키를 배포해 비밀번호 없이 접속하고, scp -r,rsync -av로 전송한다
  • man page. man -k로 키워드를 찾고, 섹션 번호로 같은 이름을 구분하며, /usr/share/doc의 예시를 활용한다

정리 #

이번 글에서 잡은 것:

  • redirection과 파이프. 출력,오류를 파일로 돌리고, |로 도구를 연결하며, tee로 저장과 표시를 동시에 한다
  • find와 grep. 조건에 맞는 파일을 찾아 -exec로 처리하고, 텍스트에서 패턴을 골라내며 맥락까지 본다
  • 텍스트 처리와 vi. less,sort,cut,sed,awk로 내용을 다루고, vi의 모드와 검색치환으로 설정 파일을 직접 고친다
  • archive와 원격 작업. tar,gzip으로 묶고, ssh 키와 scp,rsync로 다른 호스트와 파일을 주고받는다
  • man page. 인터넷 없는 시험장에서 옵션을 찾는 유일한 참고서로 활용한다

이 도구들은 그 자체로 출제 영역이면서, 동시에 나머지 모든 영역의 작업을 빠르게 해내는 바탕입니다. 손에 붙을 때까지 RHEL 실무 트랙의 환경에서 직접 쳐 보기를 권합니다.

다음: 셸 스크립트 #

도구를 손에 익혔다면, 이제 그 도구들을 묶어 자동화하는 단계로 넘어갑니다.

#3 셸 스크립트: 조건문, 반복, 인자, 종료 코드에서는 bash 스크립트의 기본 구조, if,for,while 같은 제어문, 위치 인자와 종료 코드, 그리고 RHCSA에서 요구하는 간단한 자동화 스크립트를 직접 작성하며 정리하겠습니다.

X