LFCS 수행에 필요한 Linux 기초

공식 competency 실습 전에 익혀야 할 셸, 파일, 텍스트 처리, 권한, 압축, 프로세스와 도움말 탐색


이 장의 항목은 LFCS 공식 competency를 다시 나열한 것이 아니다. 공식 과제를 실제로 수행할 때 전제되는 공통 도구다. 읽는 것보다 기초 실습을 터미널에서 수행하는 것이 중요하다.

작성·검증 상태: AI 보조 초안이다. POSIX·GNU/Linux의 공통 동작과 local man page를 기준으로 검토했으며, shell·tool version에 따라 다른 option은 실습 환경의 --help와 man page를 우선한다.

학습 목표

이 장을 마치면 다음 작업을 도움 없이 수행할 수 있어야 한다.

  • 현재 사용자·호스트·경로와 명령의 출처를 확인한다.
  • 절대 경로와 상대 경로를 구분해 파일을 안전하게 다룬다.
  • 표준 입력·출력·오류를 리다이렉션하고 파이프로 연결한다.
  • 큰 출력에서 필요한 행과 열을 검색·정렬·집계한다.
  • 파일을 조건으로 찾고 공백이 있는 이름도 안전하게 처리한다.
  • 소유권·mode bit·특수 권한·umask를 읽는다.
  • hard link와 symbolic link의 차이를 설명하고 검증한다.
  • archive와 compression을 구분해 생성·목록·복원한다.
  • process와 job을 찾고 적절한 signal을 보낸다.
  • 모르는 명령·옵션·설정 형식을 로컬 문서에서 찾는다.

1. 셸에서 먼저 확인할 것

관리 작업 전에는 누구로, 어느 호스트에서, 어느 경로를 대상으로 작업하는지 확인한다.

whoami
id
hostname
pwd
printf '%s\n' "$SHELL"

# 프롬프트처럼 보인다고 root라고 단정하지 말고 id -u를 확인한다. root 권한이 필요할 때는 문제 환경에서 허용된 방식으로 sudo 또는 root shell을 사용한다.

id -u
sudo -l
sudo -i

명령 이름이 alias, shell builtin, 함수, 실행 파일 중 무엇인지도 확인할 수 있다.

type cd
type -a ls
command -v systemctl

which는 외부 실행 파일을 찾는 데 도움이 되지만 shell builtin·함수·alias까지 설명하지 못할 수 있다. 시험형 진단에는 type -a와 command -v가 더 명확하다.

2. 경로와 파일 다루기

절대 경로와 상대 경로

  • /etc/ssh/sshd_config: /에서 시작하는 절대 경로
  • configs/sshd_config: 현재 디렉터리를 기준으로 한 상대 경로
  • .: 현재 디렉터리
  • ..: 상위 디렉터리
  • ~: 현재 사용자의 home 디렉터리로 shell이 확장

관리 작업에서는 대상 혼동을 줄이기 위해 설정 파일과 장치에 절대 경로를 사용하는 편이 안전하다.

pwd
ls -ld . .. /etc /var/log
realpath ./configs/../configs/example.conf

생성·복사·이동·삭제

install -d -m 0750 /srv/example
touch /srv/example/empty.txt
cp -a /etc/hosts /srv/example/hosts.copy
mv /srv/example/hosts.copy /srv/example/hosts.saved
stat /srv/example/hosts.saved

install -d는 디렉터리를 만들면서 mode·owner·group을 함께 지정할 수 있어 시험형 작업에 유용하다. cp -a는 가능한 범위에서 mode, owner, timestamp, link 같은 속성을 보존한다.

삭제 전에는 대상이 예상한 경로인지 출력한다.

find /srv/example -maxdepth 1 -mindepth 1 -printf '%M %u:%g %p\n'

특히 root에서 변수, wildcard, 재귀 삭제를 함께 사용할 때는 확장 결과를 먼저 확인한다.

파일 내용 확인

cat /etc/os-release
less /var/log/messages
head -n 20 /etc/passwd
tail -n 20 /var/log/messages
tail -F /var/log/messages

tail -f는 현재 파일 descriptor를 계속 따라가고, tail -F는 log rotation으로 파일이 교체되어도 파일 이름을 다시 열려고 한다.

3. quoting과 shell expansion

공백·wildcard·변수가 들어간 인자는 quoting에 따라 달라진다.

name='LFCS practice'
printf '%s\n' "$name"
printf '%s\n' '$name'
  • 작은따옴표 '...': 내부 문자를 그대로 취급
  • 큰따옴표 "...": 변수와 일부 치환은 수행하되 결과를 한 인자로 유지
  • quoting 없음: 공백 분리와 wildcard 확장이 발생할 수 있음

변수는 일반적으로 큰따옴표로 감싼다.

target='/srv/LFCS practice'
mkdir -p -- "$target"

--는 이후 값을 옵션이 아닌 operand로 해석하도록 지원하는 명령에서 옵션 처리를 끝낸다.

명령 치환 결과를 바로 파괴적인 명령의 대상으로 사용하지 않는다. 먼저 출력과 개수를 확인한다.

4. 표준 입출력과 파이프

process는 일반적으로 세 file descriptor를 사용한다.

번호이름기본 대상
0standard inputkeyboard 또는 앞 command
1standard outputterminal
2standard errorterminal
command > output.txt       # stdout 덮어쓰기
command >> output.txt      # stdout 이어쓰기
command 2> error.txt       # stderr 덮어쓰기
command > all.txt 2>&1     # stdout 대상에 stderr도 연결
command < input.txt        # 파일을 stdin으로 사용

리다이렉션은 왼쪽부터 처리되므로 순서가 중요하다.

command > all.txt 2>&1
command 2>&1 > output.txt

두 번째 줄에서는 stderr가 원래 stdout인 terminal에 먼저 연결되므로 첫 번째 줄과 결과가 다르다.

파이프는 왼쪽 command의 stdout을 오른쪽 command의 stdin으로 전달한다.

getent passwd | cut -d: -f1 | sort
journalctl -b --no-pager | grep -i error

파이프 앞 명령의 실패도 잡아야 하는 shell script에서는 set -o pipefail을 검토한다. 대화형 시험 작업에서는 각 단계의 exit status와 출력을 직접 확인하는 편이 단순하다.

printf 'exit=%s\n' "$?"

5. 텍스트 검색·변환·집계

grep

grep -n 'PermitRootLogin' /etc/ssh/sshd_config
grep -Rni --include='*.conf' 'listen' /etc 2>/dev/null
grep -E '^(root|student):' /etc/passwd
grep -vE '^[[:space:]]*(#|$)' /etc/ssh/sshd_config
  • -n: 줄 번호
  • -i: 대소문자 무시
  • -R: symbolic link까지 따라가는 재귀 검색
  • -r: 기본 재귀 검색
  • -E: extended regular expression
  • -v: 일치하지 않는 행

열 분리와 정렬

cut -d: -f1,3 /etc/passwd
getent passwd | awk -F: '$3 >= 1000 {print $1, $3}'
printf '%s\n' alpha beta alpha | sort | uniq -c

cut은 일정한 delimiter의 단순 열 선택에 적합하고, awk는 조건·계산·출력 형식이 필요한 경우에 적합하다.

sed

먼저 stdout으로 결과를 확인한 뒤 파일을 변경한다.

sed -n '1,20p' /etc/ssh/sshd_config
sed 's/^OPTION=.*/OPTION=value/' example.conf
sed -i.bak 's/^OPTION=.*/OPTION=value/' example.conf

-i.bak는 원본 백업을 남기지만 모든 명령에서 같은 방식이 제공되는 것은 아니다. 서비스 설정은 전용 문법 검사 후 reload한다.

6. 파일 찾기와 안전한 일괄 처리

find /var/log -type f -size +100M -printf '%s %p\n'
find /srv -xdev -type f -user student -perm -020 -print
find /tmp -maxdepth 1 -type f -mtime +7 -print

자주 쓰는 조건:

조건의미
-type fregular file
-type ddirectory
-name / -iname이름 일치 / 대소문자 무시
-user, -group소유 사용자·그룹
-size +100M100 MiB 초과
-mtime +77일보다 오래전에 수정
-perm -020group write bit가 모두 포함
-xdev다른 filesystem으로 넘어가지 않음

공백이나 줄바꿈이 있는 이름까지 안전하게 전달하려면 NUL delimiter를 사용한다.

find /srv/example -type f -print0 | xargs -0 -r stat --
find /srv/example -type f -exec stat -- {} +

변경·삭제 command를 붙이기 전에 -print로 대상 집합을 확인한다.

7. 소유권, mode bit와 umask

stat -c '%A %a %U:%G %n' /srv/example
chown root:operators /srv/example
chmod 2770 /srv/example

기본 mode bit:

값파일디렉터리
4 (r)내용 읽기이름 목록 읽기
2 (w)내용 변경항목 생성·삭제
1 (x)실행경로 통과·항목 접근

특수 bit:

값의미
4000setuid
2000setgid; 디렉터리에서는 새 항목의 group 상속에 사용
1000sticky; 공유 디렉터리에서 일반적으로 소유자 중심 삭제 제한

umask는 새 객체에서 제거할 권한을 정한다.

umask
umask -S

일반적으로 regular file은 실행 bit 없이 0666, directory는 0777을 출발점으로 하고 umask가 적용된다. ACL이 있으면 최종 effective permission은 ACL mask까지 함께 확인한다.

getfacl /srv/example
namei -l /srv/example/file

사용자·그룹·ACL의 전체 실습은 사용자·그룹 핵심 정리에서 이어진다.

printf 'data\n' > original.txt
ln original.txt hard.txt
ln -s original.txt symbolic.txt
ls -li original.txt hard.txt symbolic.txt
readlink symbolic.txt
readlink -f symbolic.txt
  • hard link는 같은 filesystem의 같은 inode를 가리킨다. 원본 이름을 지워도 다른 hard link가 남아 있으면 데이터는 유지된다.
  • symbolic link는 다른 pathname을 저장한 별도 inode다. 대상이 사라지면 dangling link가 될 수 있고 filesystem 경계를 넘을 수 있다.

검증할 때는 이름만 보지 말고 inode, link count, resolved path를 확인한다.

9. archive와 compression

tar는 여러 경로를 하나의 archive로 묶고, gzip·bzip2·xz는 byte stream을 압축한다.

tar -czf etc-example.tar.gz /etc/hosts /etc/os-release
tar -tzf etc-example.tar.gz
mkdir restore
tar -xzf etc-example.tar.gz -C restore

절대 경로를 archive에 넣으면 GNU tar가 기본적으로 앞의 /를 제거한다. 복원 대상과 기존 파일 덮어쓰기 가능성을 확인하고 가능하면 빈 디렉터리에 먼저 푼다.

단일 파일 압축:

gzip -k example.log
gzip -cd example.log.gz | head
xz -k example.log

archive를 만들었다는 출력만으로 끝내지 않고 목록과 시험 복원으로 검증한다.

10. process, job과 signal

ps -ef
ps -eo pid,ppid,user,stat,ni,%cpu,%mem,etime,cmd --sort=-%cpu
pgrep -a sshd
pstree -p

대화형 shell의 job:

sleep 300 &
jobs -l
fg %1

signal은 process에 동작을 요청한다.

kill -TERM PID
kill -HUP PID
kill -KILL PID

먼저 기본 TERM으로 정상 종료 기회를 주고, 상태와 로그를 확인한다. KILL은 process가 정리 작업을 수행할 수 없으므로 마지막 수단이다. 서비스 process는 가능하면 해당 service manager로 관리한다.

systemctl stop example.service
systemctl status example.service --no-pager

11. 편집과 원자적인 설정 변경

시험 환경에서 제공되는 editor 하나는 검색·저장·종료까지 사용할 수 있어야 한다. vi/vim의 최소 조작:

i          insert mode
Esc        normal mode
/pattern   아래 방향 검색
n / N      다음 / 이전 검색 결과
:w         저장
:q         종료
:wq        저장 후 종료
:q!        저장하지 않고 종료

설정 파일은 가능하면 임시 파일 작성 → 전용 문법 검사 → 원래 위치로 교체 → reload 순서를 사용한다. 단, 명령이 요구하는 소유권·mode·SELinux context도 보존해야 한다.

cp -a /etc/example.conf /etc/example.conf.bak

파일 전체를 덮어쓰기보다 요구된 항목만 최소 변경하고, 기존 설정과 충돌하는 중복 directive가 없는지 확인한다.

12. 로컬 도움말 탐색

시험형 문제에서는 외부 노트보다 설치된 문서에서 답을 찾는 능력이 중요하다.

man -k 'logical volume'
apropos -s 5,8 'ssh configuration'
command --help
man 8 command
info coreutils
find /usr/share/doc -maxdepth 2 -iname '*example*' -print

man section:

section주로 다루는 내용예시
1사용자 commandman 1 tar
5파일 형식·설정man 5 fstab
7개념·관례man 7 inode
8관리자 commandman 8 mount

같은 이름이 여러 section에 있으면 section 번호를 명시한다. man 안에서는 /keyword, n, N으로 필요한 부분만 찾는다.

명령을 찾는 전체 흐름은 문제 해석과 막혔을 때 찾는 순서와 영문 요구사항·로컬 문서 찾기에서 이어진다.

완료 기준

  • 임의의 파일 트리를 만들고 소유권·mode·link를 stat, namei, ls -li로 설명할 수 있다.
  • 파이프와 리다이렉션으로 stdout·stderr를 의도한 파일에 분리할 수 있다.
  • grep, cut, awk, sort, uniq, find를 조합해 요구된 대상만 찾는다.
  • archive를 만들고 목록 확인과 빈 경로 복원으로 검증한다.
  • process를 정확히 식별한 뒤 TERM부터 단계적으로 종료한다.
  • 처음 보는 작업의 command와 설정 형식을 man -k, --help, man section에서 찾는다.

참고 자료