위치 pwd · cd · ls
│
보기 cat(전부) · less(넘겨서) · head(앞10) · tail(뒤10) · tail -f(실시간)
│
만들기/지우기 touch · mkdir(-p) · rmdir(빈것만) · rm(-r, -f)
│
복사/이동 cp(-r 필요) · mv(-r 불필요, 이름변경 겸함) · ln(-s 심볼릭)
│
찾기 find(파일, 경로 먼저) · locate(색인, 빠름) · grep(내용)
│
세기/잇기 wc -l · | (파이프)
│
계정 useradd(-m) · passwd · usermod(-aG) · userdel(-r) · id · su · sudo
같은 글자가 여러 명령에서 비슷한 뜻으로 쓰인다.
| 글자 | 뜻 | 쓰이는 곳 |
|---|
-a | all — 전부 | ls -a(숨김 포함), usermod -aG(추가) |
-r / -R | recursive — 하위까지 | cp -r, rm -r, grep -r, ls -R |
-i | 두 가지 뜻 ⚠️ | cp -i(확인), grep -i(대소문자 무시), ls -i(inode) |
-l | long / line | ls -l(상세), wc -l(줄 수) |
-n | number | head -n(줄 수), grep -n(줄 번호) |
-f | force / follow ⚠️ | rm -f(강제), tail -f(따라가기) |
-p | parents / preserve ⚠️ | mkdir -p(중간 경로), cp -p(속성 보존) |
-v | invert | grep -v(일치하지 않는 줄) |
⚠️ 표시한 것들은 명령마다 뜻이 다르다. -f가 rm에서는 force인데 tail에서는 follow다. 이런 지점이 함정 문항으로 나온다.
같은 글자라도 대문자와 소문자는 전혀 다른 옵션이다. 보기 네 개가 대소문자만 다르게 나오는 문항이 있다.
| 소문자 | 대문자 |
|---|
ls -r 역순 정렬 | ls -R 하위 디렉터리까지 재귀 |
ls -a .·.. 포함 전부 | ls -A .·..만 빼고 전부 |
ls -s 블록 수 표시 | ls -S 크기순 정렬 |
useradd -g 기본 그룹 | useradd -G 보조 그룹 |
usermod -l 로그인 이름 변경 | usermod -L 계정 잠금 |
grep -i 대소문자 무시 | grep -E 확장 정규 표현식 |
man -k 키워드 검색(apropos) | man -f 이름으로 한 줄 설명(whatis) |
이번 주 내용은 명령을 토막 내어 읽을 수 있는가로 모인다. 아래 줄들을 왼쪽부터 끊어 읽어 본다.
find /var/log -type f -name "*.log" -mtime -7
find 명령 / /var/log 시작 경로 / -type f 파일만 / -name "*.log" 이름이 .log로 끝나는 / -mtime -7 최근 7일 안에 수정된.
- 조건을 나란히 쓰면 모두 만족(AND)하는 것만 나온다. 숫자 앞
-는 "그보다 최근", +는 "그보다 오래"다.
grep -v "^#" /etc/fstab | wc -l
grep -v 일치하지 않는 줄 / "^#" #으로 시작하는 / /etc/fstab 이 파일에서 / | 그 결과를 넘겨 / wc -l 줄 수를 센다.
- 풀어 읽으면 "주석이 아닌 줄이 몇 줄인가"다.
^는 줄의 시작, $는 줄의 끝이다.
cp -rp /home/user/docs /backup/ && ls -ld /backup/docs
cp -rp 디렉터리를 하위까지(-r), 권한·시각을 보존하며(-p) 복사 / && 성공하면 / ls -ld 디렉터리 자체의 상세 정보를 본다.
/backup이 이미 있는 디렉터리이므로 결과는 /backup/docs가 된다.
sudo useradd -m -g dev -G wheel -s /bin/bash kim
sudo 이 명령 하나만 관리자 권한으로 / useradd -m 홈 디렉터리와 함께 / -g dev 기본 그룹은 dev / -G wheel 보조 그룹은 wheel / -s /bin/bash 로그인 셸 / kim 만들 계정 이름.
- 실행 뒤
/etc/passwd에는 kim:x:UID:dev의 GID::/home/kim:/bin/bash 형태의 줄이 생긴다. 옵션 하나하나가 일곱 필드 중 하나를 채운다.
| 경로 | 무엇 | 기억할 점 |
|---|
/etc/passwd | 계정 기본 정보 | 7필드, 누구나 읽음 |
/etc/shadow | 암호화된 비밀번호·만료 정책 | 9필드, root만 읽음 |
/etc/group | 그룹 정보 | 4필드, 구성원은 쉼표로 |
/etc/sudoers | sudo 허용 설정 | visudo 로 편집 |
/etc/skel | 새 홈 디렉터리에 복사될 기본 파일 | useradd -m이 쓴다 |
/etc/login.defs | UID 범위·비밀번호 정책 기본값 | |
/sbin/nologin | 로그인을 막는 셸 | 시스템 계정의 ⑦번 필드 |
/home/사용자 | 일반 사용자의 홈 | ~ |
/root | root의 홈 | /(루트 디렉터리)와 다르다 |
| 알고 싶은 것 | 명령 |
|---|
| 조건에 맞는 파일이 어디 있나 | find 경로 조건 |
| 이름만 알 때 빨리 찾기 | locate 이름 (색인은 updatedb로 갱신) |
| 파일 안에 그 글자가 있나 | grep 패턴 파일 |
| 이 명령의 실행 파일이 어디 있나 | which 명령 |
| 실행 파일과 매뉴얼 위치까지 | whereis 명령 |
| 이 이름이 내장인가 별칭인가 | type 명령 |
| 이 명령의 사용법 | man 명령, 명령 --help |
| 이 명령이 한 줄로 무엇인가 | whatis 명령 |
| 이런 일을 하는 명령이 무엇인가 | apropos 키워드 |
| 내가 누구인가 | whoami, id |
| 누가 접속해 있나 | who, w |
[root@www ~]# ls -l /etc/passwd /tmp -d
-rw-r--r--. 1 root root 2104 Sep 3 09:00 /etc/passwd
drwxrwxrwt. 12 root root 4096 Sep 3 09:10 /tmp
| 자리 | 읽는 법 |
|---|
프롬프트의 root · # | root로 로그인한 상태. 일반 사용자였다면 $ |
프롬프트의 ~ | 현재 위치가 홈 디렉터리 (root이므로 /root) |
줄 맨 앞 - / d | 일반 파일 / 디렉터리 (l 링크, b 블록 장치, c 문자 장치) |
숫자 1 / 12 | 하드 링크 수 |
root root | 소유자 / 소유 그룹 |
2104 | 크기(바이트). -h를 붙이면 2.1K처럼 보인다 |
Sep 3 09:00 | 마지막 수정 시각 |
| 키 | 결과 |
|---|
Ctrl + C | 실행 중인 명령을 끝낸다 |
Ctrl + Z | 명령을 일시 정지시킨다 (끝난 것이 아니다) |
Ctrl + D | 입력의 끝을 알린다 / 빈 프롬프트에서는 로그아웃 |
Tab | 자동 완성, 두 번 누르면 후보 목록 |
q | man·less에서 나가기 |
| 구분 | A | B | 가르는 기준 |
|---|
find vs grep | 파일을 찾는다 | 내용을 찾는다 | 대상이 파일인가 줄인가 |
find vs locate | 직접 탐색, 정확 | 색인 검색, 빠름 | 최신성 vs 속도 |
cp -r vs mv | -r 필요 | -r 불필요 | 디렉터리 처리 방식 |
rmdir vs rm -r | 빈 것만 | 내용째 지움 | 내용이 있어도 되나 |
cat vs less | 전부 쏟아냄 | 넘겨가며 봄 | 파일 길이 |
head vs tail | 앞 10줄 | 뒤 10줄 | 어느 쪽 |
/etc/passwd vs /etc/shadow | 계정 정보, 누구나 | 비밀번호, root만 | 읽기 권한 |
su vs sudo | 사용자 전환, 대상 비번 | 명령 하나, 자기 비번 | 무엇을 입력하나 |
su vs su - | 환경 유지 | 환경까지 전환 | 하이픈 유무 |
usermod -G vs -aG | 덮어씀 | 추가함 | 기존 그룹 보존 |
| 하드 링크 vs 심볼릭 링크 | 같은 inode | 경로 바로가기 | 원본 삭제 시 |
mv에 -r을 붙여야 한다 → 아니다. mv는 디렉터리도 그냥 옮긴다. -r은 cp·rm에 필요하다.
find -name "*.txt" /home → 경로가 먼저다. find /home -name "*.txt".
usermod -G로 그룹 추가 → 기존 보조 그룹이 날아간다. -aG 를 써야 한다.
- UID 1이 root → 0이다.
rmdir로 내용 있는 디렉터리 삭제 → 안 된다. rm -r을 써야 한다.
- 비밀번호가
/etc/passwd에 있다 → /etc/shadow 에 있다. passwd의 x는 그 표시다.
su에 자기 비밀번호 → 대상 계정의 비밀번호다. 자기 것을 쓰는 건 sudo.
- 숨김 파일은 별도 속성 → 아니다. 이름이
.으로 시작할 뿐이다.
| 값 | 무엇 |
|---|
| 7 | /etc/passwd의 필드 개수 |
: | /etc/passwd의 구분자 |
| 0 | root의 UID |
| 1000 | 일반 사용자 UID 시작(배포판에 따라 500) |
| 10 | head·tail의 기본 줄 수 |
x | passwd 2번 필드 — 비밀번호가 shadow에 있다는 표시 |
다음 주는 파일에 붙는 권한 이야기다 — rwx와 8진수, 소유권, 특수 권한을 다룬다.
- 재귀(Recursive) : 하위 디렉터리까지 훑는 동작.
-r/-R 옵션.
- 페이저(Pager) : 긴 출력을 화면 단위로 끊어 보여주는 프로그램.
less, more.
- 파이프(
|) : 앞 명령의 출력을 뒤 명령의 입력으로 넘기는 기호.
- UID / GID : 사용자·그룹을 구분하는 번호. UID 0이 root다.
- 시스템 계정 : 데몬 실행용 계정. 보통 로그인 셸이
/sbin/nologin이다.
- 최소 권한 원칙 : 필요한 만큼만 권한을 주는 보안 원칙.
sudo를 권하는 이유다.
📝 연습 문제
선택지를 클릭하면 정답·해설이 펼쳐집니다.
다음 중 디렉터리를 옮길 때 재귀 옵션이 필요하지 않은 명령으로 알맞은 것은?
다음 중 파일 이름이 아니라 파일 내용에서 특정 문자열을 찾는 명령으로 알맞은 것은?
다음 중 비어 있지 않은 디렉터리를 내용과 함께 삭제하는 명령으로 알맞은 것은?
다음 중 /etc/passwd 파일의 두 번째 필드에 있는 x가 의미하는 것으로 알맞은 것은?
다음 중 사용자를 전환하면서 그 사용자의 환경 변수와 작업 디렉터리까지 적용하는 명령으로 알맞은 것은?
다음 중 파일의 앞부분 5줄만 출력하는 명령으로 알맞은 것은?