Linux 명령어 치트 시트 — 작업별 200개 이상의 명령어

파일과 권한부터 네트워크, systemd, 텍스트 처리까지 작업별로 정리한 Linux 명령어. 모든 항목에 옵션, 복사 가능한 예시, macOS 참고 사항이 있습니다.

Linux 명령어 치트 시트 · freetoolsforweb.com/tools/linux-commands-cheat-sheet · 2026-10-18 확인

마지막 확인: 2026-10-18, GNU coreutils 9.x, util-linux, procps-ng, iproute2, systemd, bash 5.2 매뉴얼. macOS 관련 내용은 macOS 26 man 페이지 기준 기준.

15개 섹션의 항목 215개

텍스트 보기와 편집

파일을 읽고, 로그를 넘겨 보고, 터미널에서 편집하고, 버전을 비교합니다.

cat

파일 출력 또는 합치기

Linux · macOS#
cat [-n] [-A] file...
-n
모든 줄에 번호 매기기
-A
탭은 ^I, 줄 끝은 $로 표시(GNU). CRLF 줄 끝을 찾아냅니다
cat /etc/os-release

파일 출력

cat part1.txt part2.txt > whole.txt

이어 붙이기

cat -A script.sh | head

숨은 탭과 Windows ^M 줄 끝 찾기

macOS/BSD: macOS cat에는 -A가 없습니다. 같은 결과를 보려면 cat -vet를 쓰세요.

tac

마지막 줄부터 파일 출력

Linux#
tac file
tac access.log | head

최신 로그 줄부터

macOS/BSD: macOS에는 없습니다. tail -r file을 쓰세요.

less

긴 파일이나 출력을 페이지 단위로 보기

Linux · macOS#
less [-N] [-S] [+F] file
Space / b
한 페이지 아래 / 위
/text
앞으로 검색. n 다음, N 이전
g / G
처음 / 끝으로 이동
F
tail -f처럼 파일 따라가기. Ctrl+C로 중지
q
종료
-N
줄 번호 표시
-S
긴 줄을 줄바꿈하지 않음(좌우로 스크롤)
less /var/log/syslog

로그 읽기

journalctl -u nginx | less -S

긴 줄을 줄바꿈 없이

head

파일의 처음 몇 줄 보기

Linux · macOS#
head [-n N] [-c N] file...
-n N
처음 N줄(기본 10)
-c N
처음 N바이트
-n -N
마지막 N줄을 뺀 전부(GNU)
head -n 20 data.csv

헤더와 처음 몇 행

head -c 512 file.bin | xxd

바이너리의 앞부분 들여다보기

macOS/BSD: macOS head는 음수 개수를 받지 않습니다.

tail

파일 끝 보기, 또는 실시간으로 따라가기

Linux · macOS#
tail [-n N] [-f|-F] file...
-n N
마지막 N줄(기본 10)
-n +N
N번째 줄부터 시작
-f
파일이 커지는 대로 계속 출력
-F
이름으로 따라가며 로그 로테이션 후에도 유지
tail -n 50 app.log

마지막 50줄

tail -F /var/log/nginx/access.log

로테이션되는 로그 지켜보기

tail -n +2 data.csv

CSV 헤더 줄 건너뛰기

nano

간단한 편집기로 파일 편집

Linux#
nano file
Ctrl+O
저장
Ctrl+X
종료
Ctrl+W
검색
Ctrl+K / Ctrl+U
줄 잘라내기 / 붙여넣기
Alt+U
실행취소
sudo nano /etc/hosts

시스템 파일 편집

화면 아래쪽 단축키 표시줄에 키가 나옵니다. ^는 Ctrl, M-는 Alt를 뜻합니다.

vim

vim으로 파일 편집(그리고 종료하는 법)

Linux · macOS#
vim file
i
입력 모드(텍스트 입력)
Esc
일반 모드로 돌아가기
:w / :q / :wq
저장 / 종료 / 저장 후 종료
:q!
저장하지 않고 종료
/text
검색. n으로 다음
dd / yy / p
줄 삭제 / 줄 복사 / 붙여넣기
u / Ctrl+R
실행취소 / 다시 실행
vim +42 app.py

42번째 줄에서 열기

diff

두 파일이나 디렉터리 비교

Linux · macOS#
diff [-u] [-r] [-q] [-w] a b
-u
통합 형식(patch와 git이 쓰는 형식)
-r
디렉터리를 재귀적으로 비교
-q
파일이 다른지만 알려 줌
-w
모든 공백 무시
-y
나란히 보기
diff -u old.conf new.conf

읽기 쉬운 변경 내용 보기

diff -rq dir1/ dir2/

두 트리 사이에서 다른 파일

diff <(sort a.txt) <(sort b.txt)

프로세스 치환으로 정렬한 뒤 비교

tee

출력을 파일과 화면에 동시에 쓰기

Linux · macOS#
tee [-a] file...
-a
덮어쓰지 않고 덧붙이기
make 2>&1 | tee build.log

빌드를 지켜보면서 로그도 남기기

echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf

root 소유 파일에 덧붙이기(리디렉션은 셸이 하므로 sudo echo >>는 실패함)

printf

서식 있는 텍스트를 안정적으로 출력

Linux · macOS#
printf 'format' args...
printf '%s\n' "$var"

-n으로 시작하는 값이라도 변수를 안전하게 출력

printf '%-12s %6.2f\n' disk 93.5

정렬된 열

echo -e와 echo -n은 셸마다 다르게 동작하지만, printf는 어디서나 똑같이 동작합니다.

column

출력을 표로 정렬

Linux · macOS#
column -t [-s separators]
column -t -s, data.csv | less -S

간단한 CSV를 표로 읽기

mount | column -t

공백으로 구분된 출력을 열 맞추기

xxd / hexdump

파일을 16진수로 보기

Linux · macOS#
xxd file | hexdump -C file
xxd image.png | head

16진수와 ASCII를 나란히

hexdump -C file.bin | head

표준 16진수 덤프

xxd는 vim 패키지에 들어 있고, hexdump는 util-linux에 있습니다(최신 Debian/Ubuntu에서는 bsdextrautils).

strings

바이너리 파일에서 읽을 수 있는 텍스트 뽑기

Linux · macOS#
strings [-n min] file
-n N
N자 이상인 문자열만(기본 4)
strings -n 8 firmware.bin | less

버전 문자열, URL, 경로 찾기

Linux에서는 binutils에 포함되어 있습니다.

권한과 소유권

파일을 누가 읽고, 쓰고, 실행할 수 있는지 확인하고 바꿉니다.

ls -l

-rwxr-x--- 같은 권한 문자열 읽기

Linux · macOS#
ls -l file
ls -l deploy.sh

-rwxr-x--- 1 alice devs 812 Oct 18 09:12 deploy.sh

첫 글자는 유형입니다(- 파일, d 디렉터리, l 심볼릭 링크). 이어서 소유자, 그룹, 그 밖의 모든 사용자 순으로 세 글자씩 묶입니다. r=4, w=2, x=1이므로 rwxr-x---는 750입니다.

chmod

8진수로 권한 변경

Linux · macOS#
chmod [-R] mode file...
-R
디렉터리와 그 안의 모든 것에 적용
-v
변경 사항을 하나씩 보고
chmod 644 index.html

소유자 읽기/쓰기, 모두 읽기: 일반 파일

chmod 755 deploy.sh

소유자 전부, 나머지 읽기/실행: 스크립트와 디렉터리

chmod 600 ~/.ssh/id_ed25519

나만 읽을 수 있는 개인 키. 권한이 더 느슨하면 ssh가 거부함

chmod u+x

문자로 권한 변경(u/g/o +/-)

Linux · macOS#
chmod [ugoa][+-=][rwxX] file...
chmod +x script.sh

스크립트를 실행 가능하게

chmod go-w file

그룹과 나머지의 쓰기 권한 제거

chmod -R u=rwX,go=rX site/

대문자 X는 디렉터리와 이미 실행 권한이 있던 파일에만 실행 권한을 줍니다

chmod -R 777

chmod -R 777이 잘못된 해결책인 이유

위험Linux · macOS#
chmod -R 777 dir
find site/ -type d -exec chmod 755 {} +

올바른 해결책 1: 디렉터리는 755

find site/ -type f -exec chmod 644 {} +

2: 파일은 644

위험: 컴퓨터의 모든 사용자와 침해된 모든 서비스에 트리 전체의 쓰기 권한을 주고, 모든 파일을 실행 가능으로 표시하며, ~/.ssh가 777이면 OpenSSH가 키를 거부합니다. /etc나 /usr에 적용하면 sudo와 시스템이 망가질 수 있습니다. 대신 chown으로 소유권을 고치거나 두 find 명령어를 쓰세요.

chown

파일의 소유자와 그룹 변경

위험Linux · macOS#
chown [-R] user[:group] file...
-R
재귀
user:
콜론을 붙이고 그룹을 생략하면 그룹도 사용자의 로그인 그룹으로 설정
sudo chown -R www-data:www-data /var/www/site

웹 루트를 웹 서버 사용자에게 넘기기

sudo chown "$USER": file.txt

root가 만든 파일의 소유권 가져오기

위험: /, /usr, /etc에 sudo chown -R을 실행하면 sudo, passwd, 서비스가 의존하는 setuid 비트와 소유권이 지워져, 복구하려면 보통 재설치해야 합니다. 경로를 다시 확인하세요.

chgrp

파일의 그룹만 변경

Linux · macOS#
chgrp [-R] group file...
chgrp -R developers /srv/shared

공유 폴더를 팀 그룹에 넘기기

umask

새 파일의 기본 권한 설정

Linux · macOS#
umask [mask]
umask

현재 마스크 표시, 보통 0022

umask 077

이 셸에서 새 파일은 600, 디렉터리는 700

마스크는 비트를 뺍니다. 파일은 666, 디렉터리는 777에서 시작하므로 022이면 644와 755가 됩니다.

sudo

root(또는 다른 사용자)로 명령어 실행

Linux · macOS#
sudo [-u user] [-i] command
-i
root 로그인 셸
-u user
root 대신 해당 사용자로 실행
-l
실행이 허용된 명령어 목록
-k
캐시된 인증 정보 지우기
sudo systemctl restart nginx

관리자 명령어 하나

sudo !!

직전 명령어를 sudo로 다시 실행

sudo -u postgres psql

서비스 사용자로 실행

su

다른 사용자로 전환

Linux · macOS#
su [-] [user]
su - deploy

deploy 사용자의 환경으로 로그인

sudo su -

root에 비밀번호가 없을 때 root 셸(sudo -i와 같음)

setfacl / getfacl

ACL로 다른 사용자 한 명에게 접근 권한 주기

Linux#
setfacl -m u:user:perms file
-m
항목 수정(추가)
-x
항목 제거
-b
모든 ACL 항목 제거
-R
재귀
-d
새 파일이 상속할 기본 ACL 설정
setfacl -m u:alice:rw report.xlsx

그룹은 바꾸지 않고 alice가 읽고 쓸 수 있게

getfacl report.xlsx

모든 항목 보기

setfacl -R -m g:devs:rwX /srv/app

그룹에 트리 전체 접근 권한 주기

ls -l 권한 문자열 끝에 +가 있으면 파일에 ACL이 있다는 뜻입니다.

chattr / lsattr

파일을 변경 불가로 만들기

Linux#
chattr +i|-i file
sudo chattr +i /etc/resolv.conf

-i를 풀기 전까지 root를 포함해 아무도 수정하거나 삭제할 수 없음

lsattr /etc/resolv.conf

속성 보기. i는 변경 불가

ext4, XFS, Btrfs에서 지원됩니다. root로도 "Operation not permitted"가 나오면 lsattr를 확인하세요.

프로세스와 작업

실행 중인 것을 찾고, 멈추고, 백그라운드에서 실행합니다.

ps

실행 중인 프로세스 목록

Linux · macOS#
ps aux | ps -ef | ps -o fields -p PID
aux
CPU, 메모리, 사용자를 포함한 모든 프로세스(BSD 방식)
-ef
부모 PID를 포함한 모든 프로세스(System V 방식)
-o
열 선택
--sort=-%mem
메모리순 정렬, 큰 것 먼저(procps)
ps aux | grep [n]ginx

[n] 트릭으로 grep 자신을 결과에서 뺌

ps aux --sort=-%mem | head

메모리를 가장 많이 쓰는 프로세스

ps -o pid,ppid,etime,cmd -p 1234

프로세스가 얼마나 오래 실행 중인지

macOS/BSD: macOS ps에는 --sort가 없습니다. ps aux -m(메모리순)이나 ps aux -r(CPU순)을 쓰세요.

pstree

프로세스를 부모/자식 트리로 보기

Linux#
pstree [-p] [user|PID]
pstree -p

PID 포함

pstree -p 1234

프로세스가 띄운 하위 프로세스

top

CPU와 메모리 사용량 실시간 보기

Linux · macOS#
top [-u user] [-p PID] [-b -n 1]
P / M
CPU / 메모리순 정렬(Linux top)
1
CPU 코어별 표시
k
PID로 프로세스 종료
q
종료
-b -n 1
스크립트용 1회 배치 스냅숏
top -b -n 1 | head -20

티켓에 붙여 넣을 수 있는 스냅숏

macOS/BSD: macOS top은 다른 프로그램입니다. top -o cpu나 top -o mem으로 정렬하세요.

htop

더 편한 대화형 프로세스 뷰어

Linux#
htop [-u user]
F3 or /
검색
F4
필터
F6
정렬 열 선택
F9
시그널 보내기(kill)
t
트리 보기
htop -u www-data

한 사용자의 프로세스만

apt install htop / dnf install htop으로 설치하세요.

pgrep

이름으로 프로세스 ID 찾기

Linux · macOS#
pgrep [-a] [-f] [-u user] pattern
-a
전체 명령줄 표시(Linux procps)
-f
이름만이 아니라 전체 명령줄과 비교
-u user
해당 사용자의 프로세스만
-x
이름 정확히 일치
pgrep -a nginx

PID와 명령줄

pgrep -f 'python manage.py runserver'

인수로 스크립트 찾기

macOS/BSD: macOS에서 -a는 "상위 프로세스 포함"이라는 뜻입니다. 이름과 인수를 보려면 pgrep -lf를 쓰세요.

pkill

이름으로 프로세스 중지

Linux · macOS#
pkill [-signal] [-f] [-u user] pattern
pkill -f "node server.js"

Node 앱 하나 중지

pkill -HUP nginx

다시 불러오기 시그널 보내기

pgrep -af node

종료 전에 -f가 무엇과 일치할지 미리 보기

패턴은 이름 어디와도 일치하는 정규식입니다. pkill node는 nodejs-helper도 건드립니다. 먼저 pgrep으로 미리 확인하세요.

kill

프로세스에 시그널 보내기(중지, 강제 종료, 다시 불러오기)

Linux · macOS#
kill [-signal] PID...
(none) / -15 / -TERM
프로세스에 정상 종료 요청(기본값)
-9 / -KILL
강제 종료. 가로챌 수 없고 정리 작업 없음
-1 / -HUP
많은 데몬이 설정을 다시 불러옴
-l
시그널 이름 목록
kill 1234

정중하게 중지

kill -9 1234

TERM이 무시될 때 최후의 수단

kill %1

이 셸의 1번 작업 종료

먼저 그냥 kill을 쓰고 몇 초 기다리세요. -9는 정리 작업을 건너뛰므로 임시 파일, 잠금, 반쯤 쓴 데이터가 남을 수 있습니다.

killall

이름이 정확히 일치하는 모든 프로세스 종료

Linux · macOS#
killall [-signal] name
killall firefox

모든 Firefox 프로세스

Linux에서는 psmisc 패키지에 들어 있습니다.

Ctrl+Z, bg, fg, jobs

명령어를 일시 정지했다가 백그라운드에서 계속 실행

Linux · macOS#
Ctrl+Z; bg [%n]; fg [%n]; jobs
jobs

이 셸의 작업과 번호 목록

bg %1

1번 작업을 백그라운드에서 재개

fg %1

다시 포그라운드로 가져오기

Ctrl+Z는 포그라운드 프로그램을 일시 중단합니다(bg나 fg를 실행할 때까지 멈춤).

&

명령어를 백그라운드에서 시작

Linux · macOS#
command &
./long-export.sh > export.log 2>&1 &

시작하고 바로 프롬프트로 돌아오기

wait

스크립트에서 백그라운드 작업이 끝날 때까지 기다리기

nohup

로그아웃 후에도 명령어 계속 실행

Linux · macOS#
nohup command > log 2>&1 &
nohup ./server > server.log 2>&1 &

SSH 세션을 닫아도 유지

오래 실행할 것이라면 systemd 서비스(서비스와 로그 참고)나 tmux가 더 안정적입니다.

disown

이미 실행 중인 작업을 셸에서 분리

Linux · macOS#
disown [-h] [%n]
disown -h %1

nohup을 깜빡했다면: bg로 백그라운드로 보낸 뒤 disown

tmux

연결이 끊겨도 터미널 세션 유지

Linux#
tmux new -s name | tmux attach -t name
Ctrl+B d
분리(세션은 계속 실행)
Ctrl+B c
새 창
Ctrl+B % / Ctrl+B "
좌우 / 상하 분할
tmux ls
세션 목록
tmux new -s deploy

이름 있는 세션 시작

tmux attach -t deploy

SSH가 끊긴 뒤 다시 연결

패키지 관리자로 설치하세요. GNU screen은 오래된 대안입니다(분리는 Ctrl+A d, 다시 연결은 screen -r).

nice / renice

CPU 우선순위를 낮추거나(높여) 명령어 실행

Linux · macOS#
nice -n N command | renice -n N -p PID
nice -n 19 tar -czf backup.tgz /data

다른 작업을 방해하지 않는 백업

sudo renice -n -5 -p 1234

실행 중인 프로세스의 우선순위 높이기

nice 값은 -20(가장 높은 우선순위)부터 19(가장 낮음)까지입니다. 0보다 낮게는 root만 설정할 수 있습니다.

timeout

너무 오래 실행되면 명령어 종료

Linux#
timeout [-s signal] duration command
timeout 30s curl -s https://example.com/health

30초 후 포기

timeout -s KILL 5m ./job.sh

5분 후 강제 종료

시간 제한에 걸리면 종료 상태 124로 끝납니다.

watch

몇 초마다 명령어 다시 실행

Linux#
watch [-n seconds] [-d] command
watch -n 2 df -h

디스크 공간이 차는 것 지켜보기

watch -d 'ss -s'

-d는 바뀐 부분을 강조

lsof

어떤 프로세스가 파일이나 포트를 열고 있는지 보기

Linux · macOS#
lsof [-i :port] [-p PID] [file]
sudo lsof -i :8080

8080 포트에서 수신 대기 중인 것

sudo lsof +L1

삭제됐지만 아직 열려 있는 파일(디스크는 꽉 찼는데 du에는 안 보일 때)

lsof -p 1234

한 프로세스가 연 모든 파일

fuser

마운트나 포트를 쓰는 것 찾기(또는 종료)

위험Linux#
fuser [-v] [-m] [-k] target
sudo fuser -vm /mnt/usb

umount가 "target is busy"라고 하는 이유

sudo fuser -v 8080/tcp

TCP 포트를 쓰는 프로세스

위험: fuser -k는 대상을 쓰는 모든 프로세스를 확인 없이 종료합니다. 마운트 지점이라면 내 셸도 포함될 수 있습니다.

time

명령어 실행 시간 측정

Linux · macOS#
time command
time ./build.sh

real = 실제 경과 시간, user + sys = CPU 시간

strace

프로그램의 시스템 호출 추적

Linux#
strace [-f] [-e trace=...] command | strace -p PID
strace -f -e trace=openat ./app 2>&1 | grep -v ENOENT

실제로 어떤 파일을 여는가?

sudo strace -p 1234

멈춘 프로세스가 어디서 막혔나?

시스템 정보와 자원

OS 버전, 커널, CPU, 메모리, 하드웨어, 시간, 부하.

uname

커널 버전과 아키텍처 보기

Linux · macOS#
uname [-a|-r|-m]
-a
전부
-r
커널 릴리스
-m
머신 아키텍처: x86_64, aarch64
uname -r

예: 6.8.0-45-generic

uname -m

어떤 바이너리를 받을지: x86_64 또는 aarch64

cat /etc/os-release

Linux 배포판과 버전 확인

Linux#
cat /etc/os-release
cat /etc/os-release

systemd 시대의 모든 배포판에 있는 NAME, VERSION_ID, ID

lsb_release -a

설치되어 있다면 Debian/Ubuntu용 대안

macOS/BSD: macOS: sw_vers.

hostnamectl

호스트 이름 보기 또는 설정

Linux#
hostnamectl [set-hostname name]
hostnamectl

호스트 이름, OS, 커널, 가상화

sudo hostnamectl set-hostname web01

컴퓨터 이름 바꾸기

uptime

가동 시간과 평균 부하 보기

Linux · macOS#
uptime
uptime

1, 5, 15분 평균 부하

부하는 실행 중이거나 대기 중인 프로세스 수입니다. CPU 수(nproc)와 비교하세요. 4코어에서 부하 4면 꽉 찬 상태입니다.

free

메모리와 스왑 사용량 확인

Linux#
free [-h]
free -h

"free"가 아니라 "available" 열을 보세요

macOS/BSD: macOS: vm_stat 또는 top -l 1 | grep PhysMem.

Linux는 남는 RAM을 디스크 캐시로 쓰므로 정상인 컴퓨터에서도 "free"가 낮게 보입니다. "available"이 프로그램이 실제로 더 쓸 수 있는 양입니다.

lscpu / nproc

CPU 모델과 코어 수 보기

Linux#
lscpu | nproc
lscpu

모델, 소켓, 코어, 스레드, 플래그

make -j"$(nproc)"

사용 가능한 모든 코어 사용

macOS/BSD: macOS: sysctl -n hw.ncpu, sysctl -n machdep.cpu.brand_string.

lspci / lsusb

PCI와 USB 장치 목록

Linux#
lspci [-k] | lsusb
lspci -k | grep -A3 -i vga

그래픽 카드와 사용 중인 드라이버

lsusb

USB 장치가 인식은 되나?

dmidecode / lshw

RAM 슬롯, BIOS, 하드웨어 세부 정보 보기

Linux#
sudo dmidecode -t type | sudo lshw -short
sudo dmidecode -t memory | grep -i size

슬롯별 설치된 RAM

sudo lshw -short

장치마다 한 줄

dmesg

커널 메시지 읽기(하드웨어, 드라이버, OOM 종료)

Linux#
dmesg [-T] [-w] [--level=...]
-T
읽기 쉬운 타임스탬프
-w
새 메시지 따라가기
--level=err,warn
문제만
sudo dmesg -T | tail -30

방금 무슨 일이 있었나(USB 연결, 디스크 오류)

sudo dmesg -T | grep -i 'out of memory'

OOM 킬러가 앱을 멈췄나?

/proc

/proc에서 CPU, 메모리, 프로세스 원시 정보 읽기

Linux#
cat /proc/<file>
grep MemAvailable /proc/meminfo

사용 가능한 메모리(kB)

grep -c ^processor /proc/cpuinfo

논리 CPU 수

cat /proc/1234/status

프로세스 하나의 상태와 메모리

vmstat / iostat

병목이 CPU, 메모리, 디스크 중 어디인지 보기

Linux#
vmstat interval count | iostat -xz interval
vmstat 1 5

r = 실행 대기열, si/so = 스와핑, wa = I/O 대기

iostat -xz 1

디스크별 사용률(%util)과 지연 시간(await)

iostat는 sysstat 패키지에 들어 있습니다.

date

날짜와 Unix 타임스탬프 출력 또는 계산

Linux · macOS#
date [+format] [-d 'description']
+%F
YYYY-MM-DD
+%s
Unix 타임스탬프(초)
-d 'text'
날짜 파싱: tomorrow, 2 days ago, @1700000000(GNU)
-u
UTC
date '+%Y-%m-%d %H:%M:%S'

로그용 타임스탬프

date +%s

1970-01-01 UTC 이후 초

date -d @1700000000

타임스탬프를 날짜로(GNU)

date -d '2 days ago' +%F

상대 날짜(GNU)

macOS/BSD: macOS date에는 -d가 없습니다. 타임스탬프는 date -r 1700000000, "2일 전"은 date -v-2d, 파싱은 date -j -f '%Y-%m-%d' 2026-10-18 +%s를 쓰세요.

timedatectl

시간대 설정과 시계 동기화 확인

Linux#
timedatectl [set-timezone Zone]
timedatectl

현지 시간, UTC, 시간대, NTP 동기화 여부

timedatectl list-timezones | grep America

시간대 이름 찾기

sudo timedatectl set-timezone America/Toronto

시간대 바꾸기

디스크와 파일 시스템

여유 공간, 공간을 차지하는 것, 파티션, 마운트, 포맷.

df

디스크 여유 공간 확인

Linux · macOS#
df [-h] [-T] [-i] [path]
-h
읽기 쉬운 크기
-T
파일 시스템 유형 표시(GNU)
-i
바이트 대신 inode 사용량
df -h

마운트된 모든 파일 시스템

df -h .

이 디렉터리가 있는 파일 시스템

df -i

공간이 남았는데 "No space left"? inode가 바닥났을 수 있음

macOS/BSD: macOS에서 -T는 유형을 표시하는 게 아니라 유형으로 필터링합니다.

du

디스크 공간을 차지하는 것 찾기

Linux · macOS#
du [-s] [-h] [-d depth] [path...]
-s
인수마다 합계 하나
-h
읽기 쉬운 크기
-d N
깊이 제한(GNU 긴 형식: --max-depth=N)
-x
한 파일 시스템 안에서만
du -sh /var/log

폴더 하나의 크기

du -h -d 1 | sort -h

하위 폴더, 가장 큰 것이 마지막(GNU와 macOS 모두 작동)

sudo du -xh -d 1 / | sort -h | tail

가장 큰 최상위 디렉터리

macOS/BSD: macOS du에는 -d는 있지만 --max-depth는 없습니다.

ncdu

디스크 사용량을 대화형으로 탐색

Linux#
ncdu [-x] [path]
sudo ncdu -x /

화살표로 이동, d로 삭제

apt install ncdu / dnf install ncdu로 설치하세요.

lsblk

디스크와 파티션 목록

Linux#
lsblk [-f]
-f
파일 시스템 유형, 레이블, UUID, 마운트 지점
lsblk

디스크, 파티션, 크기, 마운트 지점

lsblk -f

어느 파티션이 ext4/xfs인지와 UUID

macOS/BSD: macOS: diskutil list.

blkid

파티션의 UUID 확인

Linux#
sudo blkid [device]
sudo blkid /dev/sdb1

/etc/fstab에 쓸 UUID와 TYPE

findmnt

어디에 무엇이 마운트됐는지 보기

Linux#
findmnt [target] | findmnt -T path
findmnt

옵션을 포함한 마운트 트리

findmnt -T /var/lib/docker

이 경로가 어느 파일 시스템에 있는지

sudo findmnt --verify

재부팅 전에 /etc/fstab 오류 확인

mount

디스크나 파티션 마운트

Linux#
mount [-t type] [-o options] device dir
sudo mount /dev/sdb1 /mnt/usb

USB 메모리 마운트(디렉터리가 있어야 함)

sudo mount -o remount,rw /

읽기 전용 루트를 쓰기 가능하게

sudo mount -t nfs nas:/export /mnt/nas

NFS 공유 마운트

umount

디스크 마운트 해제

Linux#
umount dir|device
sudo umount /mnt/usb

이후에는 안전하게 뽑아도 됨

sudo umount -l /mnt/nas

지연: 지금 분리하고, 사용이 끝나면 정리

"target is busy"는 어떤 프로세스(흔히 그 디렉터리에 있는 내 셸)가 사용 중이라는 뜻입니다. fuser -vm이나 lsof로 찾으세요.

/etc/fstab

부팅 시 디스크 자동 마운트

Linux#
UUID=<uuid> <mountpoint> <type> <options> <dump> <pass>
UUID=3f6c...  /data  ext4  defaults,nofail  0  2

파일 시스템마다 한 줄. nofail은 디스크가 없어도 부팅을 계속하게 함

sudo mount -a

fstab의 모든 항목을 지금 마운트: 재부팅 전에 테스트

fstab에 오타가 있으면 다음 부팅 때 응급 모드로 들어갈 수 있습니다. 편집한 뒤에는 꼭 sudo mount -a(또는 findmnt --verify)를 실행하세요.

fdisk / parted

파티션 테이블 보기 또는 편집

위험Linux#
sudo fdisk -l | sudo fdisk /dev/sdX | sudo parted /dev/sdX print
sudo fdisk -l

모든 디스크와 파티션

sudo parted /dev/sdb print

파티션 테이블 유형(gpt/msdos)과 배치

위험: 파티션 테이블을 쓰면(fdisk의 w, parted의 mklabel) 그 디스크의 기존 데이터에 접근할 수 없게 됩니다. 먼저 lsblk로 장치 이름을 확인하세요. /dev/sda와 /dev/sdb는 쉽게 뒤바뀝니다.

mkfs

파티션 포맷

위험Linux#
sudo mkfs.<type> device
sudo mkfs.ext4 -L data /dev/sdb1

레이블을 붙인 ext4

sudo mkfs.vfat -F 32 /dev/sdc1

다른 기기에서도 읽을 수 있는 USB 메모리용 FAT32

위험: 대상의 파일 시스템을 즉시 지우며, 장치가 마운트되어 있지 않으면 확인도 하지 않습니다. lsblk -f로 장치를 확인하세요. /dev/sda1 대신 /dev/sda를 포맷하거나 디스크를 잘못 고르면 전부 날아갑니다.

fsck

파일 시스템 검사와 복구

위험Linux#
sudo fsck [-f] device
sudo fsck -f /dev/sdb1

마운트 해제된 파티션을 강제로 전체 검사

위험: 읽기/쓰기로 마운트된 파일 시스템에는 절대 fsck를 실행하지 마세요. 손상될 수 있습니다. 먼저 마운트를 해제하거나, 루트 파일 시스템이라면 복구 미디어로 부팅하세요.

dd

ISO를 USB 메모리에 쓰거나 디스크를 그대로 복사

위험Linux · macOS#
dd if=input of=output bs=size [status=progress] [conv=fsync]
if= / of=
입력 / 출력 파일 또는 장치
bs=4M
블록 크기. 클수록 빠름
status=progress
복사한 바이트 표시(GNU)
conv=fsync
종료 전에 장치에 플러시
sudo dd if=ubuntu.iso of=/dev/sdX bs=4M status=progress conv=fsync

부팅 USB 만들기(sdX는 파티션이 아니라 디스크 전체로 바꾸세요)

dd if=/dev/zero of=test.img bs=1M count=100

100MB 파일 만들기

위험: dd는 묻지 않고 of= 대상을 덮어씁니다. if=와 of=를 바꿔 쓰거나 /dev/sdX를 잘못 고르면 그 디스크가 지워집니다. 실행 직전에 lsblk로 확인하세요.

macOS/BSD: macOS: diskutil unmountDisk 후 /dev/rdiskN(diskutil list에서 확인)을 대상으로 하고, bs=4m을 쓰며, 진행 상황은 Ctrl+T로 봅니다.

sync

대기 중인 쓰기를 디스크에 플러시

Linux · macOS#
sync
sync && sudo umount /mnt/usb

USB 드라이브를 뽑기 전에

swapon / mkswap

스왑 공간 확인 또는 추가

Linux#
swapon --show | mkswap file && swapon file
swapon --show

현재 스왑

sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile

2GB 스왑 파일 추가(유지하려면 /etc/fstab에 추가)

Btrfs에서 스왑 파일을 쓰려면 추가 단계가 필요합니다(최신 btrfs-progs에서는 btrfs filesystem mkswapfile).

shred

삭제 전에 파일 덮어쓰기

위험Linux#
shred [-u] [-n passes] file
shred -u -n 3 secrets.txt

세 번 덮어쓴 뒤 삭제

위험: 되돌릴 수 없습니다. 또한 SSD, 저널링이나 copy-on-write 파일 시스템(Btrfs, ZFS), 스냅숏이 있는 환경에서는 믿을 수 없습니다. 제대로 보호하려면 전체 디스크 암호화를 쓰세요.

네트워크

IP 주소, 라우팅, 열린 포트, HTTP 요청, DNS, SSH, 파일 전송.

ip addr

이 컴퓨터의 IP 주소 보기

Linux#
ip [-br] addr [show dev IFACE]
ip -br a

인터페이스마다 한 줄: 이름, 상태, 주소

ip a show eth0

인터페이스 하나를 자세히

hostname -I

IP 주소만

macOS/BSD: macOS: ifconfig 또는 ipconfig getifaddr en0.

ip는 많은 배포판에서 더 이상 설치하지 않는 예전 ifconfig(net-tools)를 대체합니다.

ip route

라우팅 테이블과 기본 게이트웨이 보기

Linux#
ip route [get ADDRESS] | ip route add NET via GW
ip r

경로. "default via"가 게이트웨이

ip route get 1.1.1.1

목적지가 어떤 인터페이스와 게이트웨이를 쓰는지

sudo ip route add 10.20.0.0/16 via 192.168.1.1

경로 추가(재부팅하면 사라짐)

ip link

네트워크 인터페이스 켜기 또는 끄기

위험Linux#
ip link [set IFACE up|down]
ip link

인터페이스와 MAC 주소

sudo ip link set eth0 down && sudo ip link set eth0 up

인터페이스 껐다 켜기

위험: SSH로 접속 중인 인터페이스를 끄면 세션이 끊깁니다.

ss

수신 대기 포트와 열린 연결 목록

Linux#
ss [-t] [-u] [-l] [-p] [-n]
-t / -u
TCP / UDP
-l
수신 대기 소켓만
-p
프로세스 표시(다른 사용자 것은 sudo 필요)
-n
숫자 포트, DNS 조회 안 함
-s
요약 통계
sudo ss -tulpn

모든 수신 대기 포트와 프로그램

ss -tn state established '( dport = :443 )'

443 포트로 연결된 세션

ss -s

연결 합계

macOS/BSD: macOS: lsof -iTCP -sTCP:LISTEN -n -P 또는 netstat -an.

ss는 netstat를 대체합니다. net-tools가 설치된 곳에서는 netstat -tulpn도 여전히 작동합니다.

curl

HTTP 요청 보내기 또는 파일 다운로드

Linux · macOS#
curl [options] URL
-I
헤더만(HEAD 요청)
-L
리디렉션 따라가기
-o file / -O
파일로 저장 / 원격 이름으로 저장
-s / -S
조용히 / 그래도 오류는 표시
-f
HTTP 4xx/5xx면 오류 페이지를 출력하지 않고 실패(종료 코드 22)
-v
자세히: 요청·응답 헤더, TLS
curl -I https://example.com

상태 줄과 헤더

curl -LO https://example.com/file.tar.gz

리디렉션을 따라가며 다운로드

curl -s -o /dev/null -w '%{http_code}\n' https://example.com

상태 코드만

curl -fsSL https://example.com/install.sh -o install.sh

실행하기 전에 읽어 볼 스크립트 다운로드

curl -d

JSON으로 POST 요청 보내기

Linux · macOS#
curl -H 'Content-Type: application/json' -d 'json' URL
-d data
요청 본문. POST로 간주
--data-binary @file
파일을 그대로 전송
-H header
헤더 추가
-X METHOD
PUT, PATCH, DELETE…
-u user:pass
기본 인증
curl -H 'Content-Type: application/json' -d '{"name":"Ada"}' https://api.example.com/users

JSON POST

curl -H "Authorization: Bearer $TOKEN" https://api.example.com/me

$TOKEN이 확장되도록 큰따옴표 사용

curl -X DELETE https://api.example.com/users/42

다른 메서드

wget

파일 다운로드(이어받기 가능)

Linux#
wget [options] URL
-c
중단된 다운로드 이어받기
-O file
다른 이름으로 저장(stdout은 -O-)
-q
조용히
-r -np
재귀, 상위 디렉터리로는 올라가지 않음
wget -c https://example.com/big.iso

연결이 끊긴 뒤 이어받기

wget -qO- https://example.com/data.json | jq .

다른 명령어로 바로 파이프

macOS/BSD: 기본 macOS에는 없습니다. curl -LO를 쓰세요(이어받기는 curl -C - -LO).

dig

DNS 레코드 조회

Linux · macOS#
dig [@server] name [type] [+short]
dig +short example.com

A 레코드만

dig MX example.com

메일 서버

dig @1.1.1.1 example.com

특정 리졸버에 질의(로컬 캐시 우회)

dig -x 8.8.8.8

역방향 조회

dig +trace example.com

루트부터 위임 경로 추적

패키지 이름: dnsutils(Debian/Ubuntu) 또는 bind-utils(Fedora/RHEL).

host / nslookup

빠른 DNS 조회

Linux · macOS#
host name | nslookup name [server]
host example.com

A, AAAA, MX를 짧은 답 하나로

nslookup example.com 8.8.8.8

Windows에도 같은 명령어가 있음

resolvectl

사용 중인 DNS 서버 확인과 DNS 캐시 비우기

Linux#
resolvectl [status|query|flush-caches]
resolvectl status

인터페이스별 DNS 서버

sudo resolvectl flush-caches

systemd-resolved 캐시 비우기

macOS/BSD: macOS: sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder.

systemd-resolved를 쓰는 시스템에서만(Ubuntu, Fedora 기본값).

ping

호스트에 접근 가능한지 테스트

Linux · macOS#
ping [-c count] [-i interval] host
-c N
N개 패킷 후 중지
-i sec
패킷 간격
-4 / -6
IPv4 / IPv6 강제
ping -c 4 example.com

패킷 4개 후 요약

Linux와 macOS에서 ping은 -c를 주지 않으면 Ctrl+C를 누를 때까지 계속됩니다(Windows는 4번 후 멈춤). 응답이 없다고 꼭 다운된 것은 아닙니다. 많은 호스트가 ICMP를 차단합니다.

traceroute / tracepath

패킷이 호스트까지 가는 경로 보기

Linux · macOS#
traceroute [-n] host | tracepath host
traceroute -n example.com

DNS 조회 없이 홉 표시

tracepath example.com

root 권한 불필요, MTU도 표시

macOS/BSD: macOS에는 traceroute는 있지만 tracepath는 없습니다.

Linux에서는 traceroute를 따로 설치해야 할 수 있지만, tracepath(iputils)는 보통 있습니다.

mtr

패킷 손실이 어디서 생기는지 찾기

Linux#
mtr [-r] [-w] [-c count] host
mtr -rw -c 100 example.com

홉마다 100번 측정 후 보고서

ping과 traceroute를 합친 도구입니다. 중간 홉 하나에서만 손실이 보이면 보통 그 라우터가 ICMP 우선순위를 낮춘 것이고, 끝까지 이어지는 손실이 진짜입니다.

ssh

원격 컴퓨터에 로그인

Linux · macOS#
ssh [-p port] [-i key] [-J jump] user@host [command]
ssh alice@203.0.113.10

로그인

ssh -p 2222 alice@host

표준이 아닌 포트

ssh alice@host 'df -h'

명령어 하나만 실행하고 돌아오기

ssh -J bastion.example.com alice@10.0.0.5

배스천 호스트를 거쳐 접속

ssh -L / -R / -D

SSH로 포트 포워딩(터널)

Linux · macOS#
ssh -L local:host:remote user@server
-L 5432:localhost:5432
로컬 5432 포트가 서버의 5432 포트로 연결
-R 8080:localhost:3000
서버 8080 포트가 내 로컬 3000으로 연결
-D 1080
로컬 1080 포트에 SOCKS 프록시
-N
원격 명령어 없이 터널만
ssh -N -L 5432:localhost:5432 alice@db-host

로컬 DB 클라이언트를 원격 Postgres에 연결

ssh -N -D 1080 alice@host

서버를 거쳐 웹 브라우징

ssh-keygen

SSH 키를 만들어 서버에 설치

Linux · macOS#
ssh-keygen -t ed25519 [-C comment] | ssh-copy-id user@host
ssh-keygen -t ed25519 -C "you@example.com"

~/.ssh에 새 키 쌍 생성

ssh-copy-id alice@host

공개 키를 서버의 authorized_keys에 추가

ssh-keygen -R host

서버를 다시 만든 뒤 예전 호스트 키 제거("REMOTE HOST IDENTIFICATION HAS CHANGED")

~/.ssh/config

SSH 접속 설정을 짧은 별칭으로 저장

Linux · macOS#
Host alias / HostName / User / Port / IdentityFile
Host web
  HostName 203.0.113.10
  User deploy
  Port 2222
  IdentityFile ~/.ssh/id_ed25519

이후에는 ssh web만 입력(scp와 rsync도 사용)

scp

SSH로 서버와 파일 주고받기

Linux · macOS#
scp [-r] [-P port] source... dest
-r
디렉터리 복사
-P port
포트(대문자 P, ssh는 소문자 -p)
-i key
인증 키 파일
scp report.pdf alice@host:/tmp/

업로드

scp alice@host:/var/log/app.log .

다운로드

scp -r -P 2222 site/ alice@host:~/

다른 포트로 폴더 업로드

OpenSSH 9.0부터 scp는 내부적으로 SFTP 프로토콜을 씁니다. 크거나 반복되는 복사에는 변경분만 보내는 rsync가 더 빠릅니다.

rsync

로컬이나 SSH로 폴더 동기화

Linux · macOS#
rsync [-avz] [--progress] [-n] source dest
-a
아카이브: 재귀, 권한·시간·링크 유지
-v
자세히
-z
전송 중 압축
-P
진행 상황 표시와 부분 파일 이어받기
-n
시험 실행: 무엇이 일어날지 표시
--exclude 'pattern'
파일 건너뛰기
-e 'ssh -p 2222'
사용자 지정 SSH 옵션
rsync -avzP site/ deploy@host:/srv/site/

site/ 끝의 슬래시는 폴더 자체가 아니라 내용을 복사

rsync -av --exclude 'node_modules' ./ /backup/app/

불필요한 것 없이 로컬 백업

macOS/BSD: 최신 macOS에는 rsync 대신 openrsync가 들어 있습니다. 흔한 플래그는 작동하지만 드문 플래그 중에는 안 되는 것도 있습니다.

src/는 "src의 내용", 슬래시 없는 src는 "src 폴더"를 뜻합니다. 이를 틀리면 폴더가 중첩됩니다(dest/src/…).

rsync --delete

대상을 정확한 미러로 만들기

위험Linux · macOS#
rsync -av --delete source/ dest/
rsync -avn --delete site/ /srv/site/

먼저 시험 실행: "deleting"으로 시작하는 줄이 삭제될 항목

rsync -av --delete site/ /srv/site/

그다음 실제 실행

위험: 원본에 없는 것은 dest에서 모두 삭제합니다. 원본과 대상을 바꿔 쓰거나 원본 경로가 비었거나 틀리면 대상이 지워집니다. 항상 먼저 -n으로 실행하세요.

nc

TCP 포트가 열려 있는지 테스트

Linux · macOS#
nc -zv host port | nc -l port
nc -zv db.internal 5432

"succeeded" 또는 "Connection refused"/시간 초과

nc -l 9000

포트에서 수신 대기해 반대편에서 방화벽 테스트

netcat 종류마다 플래그가 다릅니다. 전통적인 버전은 nc -l -p 9000이 필요합니다.

ufw

Ubuntu에서 방화벽 관리

위험Linux#
sudo ufw [status|allow|deny|delete|enable]
sudo ufw status verbose

규칙과 기본 정책

sudo ufw allow 22/tcp

SSH 허용(enable 전에 하세요)

sudo ufw allow from 10.0.0.0/8 to any port 5432

포트 하나, 네트워크 하나

위험: 원격 서버에서 SSH를 먼저 허용하지 않고(ufw allow OpenSSH 또는 22/tcp) sudo ufw enable을 실행하면 접속이 막힙니다.

firewall-cmd

Fedora/RHEL에서 방화벽 관리

Linux#
sudo firewall-cmd [--permanent] --add-service|--add-port ...
sudo firewall-cmd --list-all

활성 영역과 규칙

sudo firewall-cmd --permanent --add-service=https && sudo firewall-cmd --reload

HTTPS 영구 개방

sudo firewall-cmd --permanent --add-port=8080/tcp

포트 개방

--permanent가 없으면 규칙은 다음 다시 불러오기나 재부팅까지만 유지됩니다.

nmcli

Wi-Fi와 연결 관리(NetworkManager)

Linux#
nmcli [device|connection] ...
nmcli device status

인터페이스와 연결 여부

nmcli device wifi list

주변 네트워크

nmcli device wifi connect 'MyWiFi' password 'secret'

네트워크에 연결

패키지: apt, dnf, pacman, zypper

주요 패키지 관리자 4종에서 같은 작업을 하는 방법: Debian/Ubuntu(apt), Fedora/RHEL(dnf), Arch(pacman), openSUSE(zypper). 시스템을 바꾸는 명령어에는 앞에 sudo를 붙이세요.

작업apt(Debian, Ubuntu)dnf(Fedora, RHEL)pacman(Arch)zypper(openSUSE)
패키지 목록 새로고침 #
dnf는 메타데이터가 오래되면 자동으로 새로고칩니다. Arch에서는 pacman -Sy 뒤에 -S pkg를 실행하지 마세요. 부분 업그레이드는 지원되지 않으므로 -Syu를 쓰세요.
apt update
dnf makecache
pacman -Sy
zypper refresh
전체 업그레이드 #
openSUSE Tumbleweed는 zypper dup을 씁니다. apt full-upgrade는 업그레이드를 마치는 데 필요하면 패키지를 제거하기도 합니다.
apt update && apt upgrade
dnf upgrade
pacman -Syu
zypper update
패키지 설치 #
apt install nginx
dnf install nginx
pacman -S nginx
zypper install nginx
다운로드한 패키지 파일 설치 #
./는 apt에게 패키지 이름이 아니라 파일이라고 알려 주므로 의존성이 해결됩니다(dpkg -i는 해결하지 않음).
apt install ./app.deb
dnf install ./app.rpm
pacman -U app.pkg.tar.zst
zypper install ./app.rpm
패키지 제거 #
apt remove nginx
dnf remove nginx
pacman -R nginx
zypper remove nginx
설정 파일 / 사용하지 않는 의존성까지 제거 #
apt purge nginx && apt autoremove
dnf remove nginx && dnf autoremove
pacman -Rns nginx
zypper remove --clean-deps nginx
패키지 세부 정보 보기 #
apt show nginx
dnf info nginx
pacman -Si nginx (installed: -Qi)
zypper info nginx
설치된 패키지 목록 #
apt list --installed
dnf list --installed
pacman -Q
zypper search --installed-only
사용 가능한 업데이트 목록 #
apt list --upgradable
dnf check-update
checkupdates (pacman-contrib)
zypper list-updates
파일이 어느 패키지에 속하는지 확인 #
아직 설치되지 않은 파일: dnf provides /path, apt-file search path(apt-file 필요), pacman -F path.
dpkg -S /usr/bin/curl
rpm -qf /usr/bin/curl
pacman -Qo /usr/bin/curl
rpm -qf /usr/bin/curl
패키지가 설치한 파일 목록 #
dpkg -L nginx
rpm -ql nginx
pacman -Ql nginx
rpm -ql nginx
패키지를 현재 버전으로 고정 #
DNF 4에서 versionlock을 쓰려면 versionlock 플러그인 패키지가 필요합니다.
apt-mark hold nginx
dnf versionlock add nginx
IgnorePkg = nginx in /etc/pacman.conf
zypper addlock nginx
패키지 캐시 비우기 #
apt clean
dnf clean all
pacman -Sc
zypper clean

사용자와 그룹

내가 누구인지, 누가 로그인했는지, 그리고 계정 관리.

whoami / id

내 사용자 이름, UID, 그룹 보기

Linux · macOS#
whoami | id [user]
id

uid, gid, 속한 모든 그룹

id alice

다른 사용자

who / w / last

로그인한 사용자와 최근 로그인 보기

Linux · macOS#
who | w | last [-n N]
w

누가 접속해 무엇을 실행 중인지

last -n 10

최근 로그인과 재부팅

sudo lastb -n 10

최근 로그인 실패(Linux)

useradd

사용자 계정 만들기

Linux#
sudo useradd [-m] [-s shell] [-G groups] user
-m
홈 디렉터리 만들기(모든 배포판의 기본값은 아님)
-s /bin/bash
로그인 셸
-G group1,group2
보조 그룹
sudo useradd -m -s /bin/bash alice && sudo passwd alice

계정을 만들고 비밀번호 설정

Debian/Ubuntu에서는 adduser alice가 홈 디렉터리와 비밀번호까지 설정해 주는 더 친절한 대화형 래퍼입니다.

usermod -aG

사용자를 그룹에 추가

위험Linux#
sudo usermod -aG group user
sudo usermod -aG docker alice

alice가 docker를 실행할 수 있게

sudo usermod -aG sudo alice

Debian/Ubuntu에서 관리자 권한(Fedora/RHEL/Arch는 wheel 그룹)

위험: -a 없이 usermod -G를 쓰면 사용자의 보조 그룹이 모두 교체되어 sudo 권한이 사라질 수 있습니다. 그룹 변경은 다음 로그인부터 적용됩니다(또는 newgrp docker 실행).

userdel

사용자 계정 삭제

위험Linux#
sudo userdel [-r] user
sudo userdel -r olduser

홈 디렉터리와 메일 스풀도 삭제

위험: -r은 홈 디렉터리와 파일을 영구 삭제합니다. 먼저 백업하거나, 대신 계정을 잠그세요(passwd -l).

passwd

비밀번호 변경 또는 계정 잠금

Linux#
passwd [user] | passwd -l|-u user
passwd

내 비밀번호 변경

sudo passwd alice

다른 사람의 비밀번호 재설정

sudo passwd -l alice

비밀번호 로그인 잠금(SSH 키는 여전히 작동할 수 있음)

groupadd / gpasswd

그룹 만들기 또는 그룹에서 사용자 제거

Linux#
sudo groupadd name | sudo gpasswd -d user group
sudo groupadd developers

새 그룹

sudo gpasswd -d alice developers

그룹에서 alice 제거

groups / getent

그룹 구성원 또는 사용자의 그룹 목록

Linux#
groups [user] | getent group name
groups alice

alice의 그룹

getent group sudo

sudo 그룹 구성원(LDAP에서도 작동)

getent passwd alice

계정 항목: UID, 홈, 셸

visudo

사용자에게 안전하게 sudo 권한 주기

Linux · macOS#
sudo visudo [-f /etc/sudoers.d/file]
sudo visudo -f /etc/sudoers.d/deploy

규칙마다 별도 파일

deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp

비밀번호 없이 명령어 하나 허용

visudo는 저장 전에 문법을 검사합니다. 일반 편집기로 /etc/sudoers를 고치다 오타가 나면 모두가 sudo를 못 쓰게 될 수 있습니다.

chage

비밀번호 만료 확인 또는 설정

Linux#
sudo chage [-l] [-M days] user
sudo chage -l alice

마지막 변경일과 만료일

sudo chage -M 90 alice

90일마다 만료

아카이브와 압축

tar, gzip, xz, zip, 체크섬.

tar -c

.tar.gz 아카이브 만들기

Linux · macOS#
tar -czf archive.tar.gz files...
-c
만들기
-z / -j / -J
gzip / bzip2 / xz 압축
-f file
아카이브 파일 이름(f 바로 뒤에)
-v
들어가는 파일을 하나씩 표시
--exclude='pattern'
파일 제외
tar -czf site-2026-10-18.tar.gz site/

폴더를 gzip 압축 아카이브로

tar -cJf logs.tar.xz --exclude='*.tmp' logs/

임시 파일을 빼고 더 작은 xz 아카이브로

tar -x

.tar.gz, .tar.xz, .tar.bz2 압축 풀기

Linux · macOS#
tar -xf archive [-C dir]
-x
풀기
-C dir
dir에 풀기(디렉터리가 있어야 함)
--strip-components=1
최상위 폴더 제거
tar -xf archive.tar.gz

GNU tar와 macOS tar는 압축 방식을 스스로 감지

tar -xzf app.tar.gz -C /opt/app --strip-components=1

감싸는 디렉터리 없이 폴더 안에

tar -t

아카이브 목록 보기 또는 파일 하나만 풀기

Linux · macOS#
tar -tf archive | tar -xf archive path/in/archive
tar -tf backup.tar.gz | less

풀지 않고 내용 보기

tar -xf backup.tar.gz etc/nginx/nginx.conf

파일 하나만 꺼내기(-t로 보이는 경로)

tar --zstd

zstd로 빠르게 압축

Linux · macOS#
tar --zstd -cf archive.tar.zst files...
tar --zstd -cf data.tar.zst data/

xz보다 훨씬 빠르고, 압축률은 gzip -9와 비슷하거나 더 좋음

zstd -d file.zst

파일 하나 압축 해제

GNU tar 1.31 이상(또는 최신 bsdtar)과 zstd 프로그램이 필요합니다.

gzip / gunzip

파일 하나 압축 또는 압축 해제

Linux · macOS#
gzip [-k] [-d] [-9] file
-k
원본 유지
-d
압축 해제(gunzip과 같음)
-9
최고 압축
gzip -k access.log

access.log.gz를 만들고 원본 유지

zcat access.log.gz | grep 404

디스크에 풀지 않고 읽기

zgrep 500 access.log.*.gz

로테이션된 로그를 바로 grep

-k가 없으면 gzip은 원본 파일을 .gz 버전으로 바꿉니다.

xz / bzip2

파일 하나를 더 높은 압축률로

Linux#
xz [-T0] [-9] [-d] file | bzip2 [-d] file
xz -T0 -k big.sql

모든 CPU 코어 사용, 원본 유지

unxz big.sql.xz

압축 해제

zip

.zip 파일 만들기

Linux · macOS#
zip -r archive.zip files... [-x pattern]
zip -r site.zip site/

폴더 압축

zip -r site.zip site/ -x '*.git*' '*/node_modules/*'

경로 제외

zip -e는 취약한 구식 ZipCrypto 방식으로 암호화합니다. 제대로 보호하려면 7z나 gpg를 쓰세요.

unzip

.zip 파일 압축 풀기

Linux · macOS#
unzip [-l] [-o] archive.zip [-d dir]
unzip files.zip -d files/

폴더 안에

unzip -l files.zip

내용 목록만

unzip -o files.zip

묻지 않고 덮어쓰기

7z

.7z(및 대부분의 다른) 아카이브 다루기

Linux#
7z a|x|l archive [files]
7z x archive.7z

전체 경로를 유지하며 풀기

7z a -p backup.7z docs/

AES-256 암호화 아카이브(비밀번호를 물어봄)

7z l archive.rar

여러 형식의 내용 목록

패키지: Debian/Ubuntu는 p7zip-full / 7zip, Fedora/Arch는 p7zip 또는 7zip.

sha256sum

체크섬으로 다운로드 검증

Linux#
sha256sum file | sha256sum -c SUMSFILE
sha256sum ubuntu.iso

다운로드 페이지의 해시와 비교

sha256sum -c SHA256SUMS --ignore-missing

목록 중 실제로 가진 파일만 모두 확인

macOS/BSD: macOS: shasum -a 256 file(그리고 shasum -a 256 -c SUMSFILE).

split

큰 파일을 여러 조각으로 나누고 합치기

Linux · macOS#
split -b size file prefix
split -b 100M backup.tar.gz backup.part.

backup.part.aa, .ab, …

cat backup.part.* > backup.tar.gz

다시 합치기

텍스트 처리

텍스트와 JSON을 자르고, 거르고, 정렬하고, 세고, 변환하고, 재구성합니다.

sed s///

텍스트 찾아 바꾸기

Linux · macOS#
sed 's/old/new/[g]' file
g
첫 번째만이 아니라 줄의 모든 일치 항목 바꾸기
-E
확장 정규식(백슬래시 없이 그룹)
I
대소문자 구분 없이 일치(GNU)
sed 's/http:/https:/g' links.txt

결과만 출력하고 파일은 그대로

sed 's|/usr/local|/opt|g' paths.txt

구분자는 아무 문자나 가능, 경로에 편리

sed -E 's/([0-9]+)px/\1rem/g' style.css

캡처한 그룹 재사용

sed -i

파일을 직접 수정

Linux · macOS#
sed -i[SUFFIX] 's/old/new/g' file
sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_config

GNU sed

sed -i.bak 's/foo/bar/g' config.ini

config.ini.bak을 남김. GNU와 macOS 모두 작동

macOS/BSD: macOS sed는 -i 뒤에 인수가 필요합니다: sed -i '' 's/foo/bar/g' file. GNU sed는 ''를 스크립트로 읽으므로 양쪽에서 모두 되는 형태는 -i.bak뿐입니다.

sed -n / d

특정 줄 출력 또는 삭제

Linux · macOS#
sed -n 'Np' | sed '/regex/d'
sed -n '100,120p' big.log

100~120번째 줄

sed '/^\s*#/d; /^$/d' app.conf

주석과 빈 줄 제거(GNU \s)

sed -n '/BEGIN CERT/,/END CERT/p' bundle.pem

두 표시 사이의 모든 내용

awk

특정 열 출력

Linux · macOS#
awk [-F sep] '{print $N}' file
-F sep
필드 구분자(기본값: 연속된 공백/탭)
$1 … $NF
필드. $NF는 마지막, $0은 줄 전체
NR
줄 번호
awk '{print $1}' access.log

첫 번째 열(클라이언트 IP)

awk -F: '{print $1, $7}' /etc/passwd

사용자와 셸

awk -F, 'NR>1 {print $2}' data.csv

CSV 두 번째 열, 헤더 건너뛰기(따옴표 안 쉼표가 없는 단순 CSV만)

awk (filter & sum)

행을 거르고 열 합계 내기

Linux · macOS#
awk 'condition {action} END {action}' file
awk '$9 >= 500' access.log

9번째 필드(상태)가 5xx인 줄

awk '{s += $2} END {print s}' sales.txt

2번째 열의 합계

awk '{c[$1]++} END {for (k in c) print c[k], k}' access.log | sort -rn | head

값별 개수, 상위 10개

cut

한 글자 구분자로 필드 자르기

Linux · macOS#
cut -d DELIM -f LIST | cut -c RANGE
cut -d, -f1,3 data.csv

1번째와 3번째 열

cut -d: -f1 /etc/passwd

모든 사용자 이름

cut -c1-10 file

각 줄의 처음 10글자

cut은 구분자마다 필드를 나누므로 공백 두 개는 빈 필드가 됩니다. 공백으로 정렬된 출력에는 awk를 쓰세요.

sort

줄 정렬

Linux · macOS#
sort [-n] [-r] [-h] [-k N,N] [-t sep] [-u] file
-n
숫자순
-r
역순
-h
사람이 읽는 크기: 2K < 1M < 3G
-k 2,2
2번째 필드로만 정렬
-t ,
필드 구분자
-u
중복 제거
-V
버전 순서: 1.9 < 1.10
du -sh * | sort -h

크기순 폴더

sort -t, -k3,3nr data.csv

CSV를 3번째 열 기준 숫자 내림차순으로

sort -u emails.txt > unique.txt

정렬하고 중복 제거

uniq

중복 줄 세기 또는 제거

Linux · macOS#
sort file | uniq [-c] [-d] [-u]
-c
각 줄 앞에 개수 표시
-d
반복되는 줄만
-u
한 번만 나오는 줄만
sort ips.txt | uniq -c | sort -rn | head

가장 자주 나오는 줄 상위 10개

uniq는 인접한 중복만 합치므로 먼저 정렬하세요.

wc

줄, 단어, 바이트 수 세기

Linux · macOS#
wc [-l] [-w] [-c] [-m] file...
wc -l access.log

줄 수

ls | wc -l

이 폴더의 항목 수

grep -c '' file

줄바꿈 없는 마지막 줄까지 포함한 줄 수

tr

문자 변환 또는 삭제

Linux · macOS#
tr [-d] [-s] 'set1' ['set2']
tr 'a-z' 'A-Z' < in.txt

대문자로

tr -d '\r' < windows.txt > unix.txt

Windows CRLF 줄 끝 제거

tr -s ' ' < file

연속된 공백 줄이기

tr '\n' ',' < list.txt

줄을 쉼표로 이어 붙이기

tr은 표준 입력만 읽으므로 <로 파일을 넘기세요.

xargs

입력 줄을 명령어 인수로 바꾸기

Linux · macOS#
command | xargs [-0] [-n N] [-P N] [-I {}] cmd
-0
입력이 NUL로 구분됨(find -print0과 함께). 공백이 있어도 안전
-n N
명령어당 최대 N개 인수
-P N
명령어 N개를 병렬 실행
-I {}
{}를 각 입력 줄로 치환
-r
입력이 비어 있으면 명령어를 실행하지 않음(GNU)
find . -name '*.log' -print0 | xargs -0 rm -f

찾은 파일을 안전하게 삭제

cat urls.txt | xargs -n 1 -P 4 curl -sO

한 번에 4개씩 다운로드

ls *.png | xargs -I {} cp {} /backup/{}

항목마다 명령어 하나

macOS/BSD: GNU xargs는 -r을 주지 않으면 입력이 비어 있어도 명령어를 한 번 실행합니다. macOS xargs는 기본으로 빈 입력을 건너뛰며 호환성을 위해 -r도 받습니다.

jq

JSON 읽기와 필터링

Linux · macOS#
jq [-r] 'filter' file
.
보기 좋게 출력
-r
따옴표 없는 원시 문자열
-c
압축, 결과마다 한 줄
.[]
배열 순회
select(cond)
일치하는 항목만 남기기
jq . response.json

보기 좋게 출력

jq -r '.items[].name' data.json

한 줄에 이름 하나

jq -r '.[] | select(.active) | .email' users.json

거른 다음 필드 고르기

curl -s https://api.github.com/repos/jqlang/jq | jq '.stargazers_count'

API에서 바로

apt/dnf install jq로 설치하세요. 최신 macOS에는 기본 포함되어 있습니다.

paste

줄 합치기 또는 파일을 나란히 병합

Linux · macOS#
paste [-s] [-d delim] file...
paste -sd, ids.txt

모든 줄을 쉼표로 이어 붙이기

paste names.txt emails.txt

두 파일을 두 열로

comm

두 목록의 공통(또는 고유) 줄

Linux · macOS#
comm [-1] [-2] [-3] sorted1 sorted2
comm -12 <(sort a.txt) <(sort b.txt)

양쪽 모두에 있음

comm -23 <(sort a.txt) <(sort b.txt)

a.txt에만 있음

seq

숫자 시퀀스 생성

Linux · macOS#
seq [first [step]] last
seq 1 5

1부터 5까지 한 줄에 하나씩

seq -w 1 10

0 채우기: 01 … 10

for i in $(seq 1 3); do echo "run $i"; done

반복문 카운터

base64

Base64 인코딩 또는 디코딩

Linux · macOS#
base64 [-d] [-w 0] [file]
printf '%s' 'user:pass' | base64

인코딩(printf는 끝 줄바꿈을 붙이지 않음)

echo dXNlcjpwYXNz | base64 -d

디코딩

base64 -w 0 image.png > image.b64

줄바꿈 없이(GNU는 76자에서 줄바꿈)

macOS/BSD: macOS base64는 기본으로 줄바꿈하지 않으며 -w가 없습니다. 디코딩은 -d를 쓰세요(예전 macOS는 -D).

iconv

텍스트 인코딩 변환(예: UTF-8로)

Linux · macOS#
iconv -f FROM -t TO file
iconv -f WINDOWS-1252 -t UTF-8 old.csv > new.csv

Excel에서 내보낸 파일의 글자 깨짐 고치기

iconv -l

지원하는 인코딩 목록

shuf

줄 섞기 또는 무작위로 고르기

Linux#
shuf [-n N] file
shuf -n 1 names.txt

무작위 줄 하나

shuf -i 1-100 -n 5

1~100 중 무작위 숫자 5개

서비스와 로그

systemd 서비스: 시작, 중지, 부팅 시 사용 설정, journalctl로 로그 읽기.

systemctl status

서비스가 실행 중인지 확인

Linux#
systemctl status|is-active|is-enabled unit
systemctl status nginx

상태, PID, 메모리, 마지막 로그 줄

systemctl is-active --quiet nginx && echo up

스크립트용

systemctl start

서비스 시작, 중지, 다시 시작, 다시 불러오기

Linux#
sudo systemctl start|stop|restart|reload unit
sudo systemctl restart nginx

완전히 다시 시작

sudo systemctl reload nginx

연결을 끊지 않고 설정 다시 읽기(서비스가 지원하는 경우)

가능하면 다시 시작하기 전에 설정을 테스트하세요(예: sudo nginx -t). 오타 하나로 사이트가 내려가는 일을 막을 수 있습니다.

systemctl enable

부팅 시 서비스 시작(또는 시작 안 함)

Linux#
sudo systemctl enable|disable [--now] unit
sudo systemctl enable --now docker

부팅 시 사용 설정하고 지금 시작

sudo systemctl disable --now cups

지금 중지하고 부팅 시에도 시작 안 함

sudo systemctl mask bluetooth

아예 시작되지 못하게 차단(되돌리려면 unmask)

systemctl list-units

실행 중이거나 실패한 서비스 목록

Linux#
systemctl list-units [--type=service] [--state=…] | systemctl --failed
systemctl --failed

무엇이 고장 났나

systemctl list-units --type=service --state=running

무엇이 실행 중인가

systemctl list-unit-files --state=enabled

부팅 시 무엇이 시작되나

systemctl edit

서비스 유닛 수정(그리고 systemd 다시 불러오기)

Linux#
sudo systemctl edit unit | sudo systemctl daemon-reload
sudo systemctl edit nginx

패키지 업그레이드 후에도 유지되는 드롭인 오버라이드

systemctl cat nginx

유닛과 모든 오버라이드

sudo systemctl daemon-reload

유닛 파일을 직접 수정한 뒤 필요

.service file

내 앱을 서비스로 실행

Linux#
/etc/systemd/system/<name>.service
[Unit]
Description=My app
After=network.target

[Service]
User=app
WorkingDirectory=/srv/app
ExecStart=/srv/app/bin/server
Restart=on-failure

[Install]
WantedBy=multi-user.target

그다음: sudo systemctl daemon-reload && sudo systemctl enable --now myapp

journalctl

서비스와 시스템 로그 읽기

Linux#
journalctl [-u unit] [-f] [-n N] [--since …] [-p level] [-b]
-u unit
서비스 하나
-f
따라가기
-n N
마지막 N줄
--since '1 hour ago'
today, yesterday, 2026-10-18 09:00도 가능
-p err
err 이상 우선순위
-b / -b -1
이번 부팅 / 이전 부팅
-e
끝으로 이동
journalctl -u nginx -f

서비스 하나 따라가기

journalctl -u myapp --since '10 min ago'

최근 구간

journalctl -b -1 -p err

충돌 전 부팅의 오류

journalctl --vacuum

systemd 저널 줄이기

Linux#
journalctl --disk-usage | sudo journalctl --vacuum-size=SIZE | --vacuum-time=TIME
journalctl --disk-usage

로그가 차지하는 공간

sudo journalctl --vacuum-size=500M

보관된 로그를 최대 500MB로 유지

sudo journalctl --vacuum-time=14d

2주보다 오래된 보관 로그 삭제

영구 제한은 /etc/systemd/journald.conf에서 SystemMaxUse=로 설정하세요.

/var/log

전통적인 로그 파일 찾기

Linux#
sudo tail -f /var/log/<file>
sudo tail -f /var/log/syslog

Debian/Ubuntu의 일반 로그(Fedora/RHEL은 /var/log/messages)

sudo tail -f /var/log/auth.log

Debian/Ubuntu의 로그인과 sudo 기록(RHEL은 /var/log/secure)

일부 배포판(Fedora, Arch)은 rsyslog가 설치되어 있지 않으면 로그를 저널에만 보관합니다.

shutdown / reboot

재부팅 또는 전원 끄기

Linux#
sudo shutdown -r|-h [now|+min|hh:mm] [message] | sudo reboot
sudo reboot

지금 재부팅

sudo shutdown -r +10 'Kernel update'

로그인한 사용자에게 알리고 10분 후 재부팅

sudo shutdown -c

예약된 종료 취소

sudo shutdown -h now

전원 끄기

예약 실행: cron, at, 타이머

명령어를 일정에 맞춰 실행하거나 나중에 한 번 실행합니다.

cron syntax

cron 일정 줄 작성

Linux · macOS#
minute hour day-of-month month day-of-week command
30 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

매일 02:30, 출력 보관

*/15 * * * * /usr/local/bin/check.sh

15분마다

0 9 * * 1-5 /usr/local/bin/report.sh

월요일~금요일 09:00

@reboot /usr/local/bin/startup.sh

부팅 시 한 번

cron은 최소한의 PATH로, 셸 프로필 없이 실행됩니다. 절대 경로를 쓰세요. 명령어 안의 %는 \%로 이스케이프해야 합니다.

crontab -r

crontab 삭제(주의)

위험Linux · macOS#
crontab -r
crontab -l > ~/crontab.bak && crontab -r

삭제 전에 백업

crontab ~/crontab.bak

파일에서 복원

위험: 확인 없이 내 cron 작업을 모두 삭제하며, 키보드에서 r은 e 바로 옆에 있습니다. 일부 cron 구현은 먼저 묻는 -i를 지원합니다(crontab -ri).

/etc/cron.d

시스템 전체 cron 작업

Linux#
/etc/crontab, /etc/cron.d/*, /etc/cron.{hourly,daily,weekly,monthly}/
0 3 * * * root /usr/local/bin/cleanup.sh

/etc/cron.d/cleanup의 한 줄: 사용자 필드가 추가로 있음에 주의

ls /etc/cron.daily/

run-parts가 하루 한 번 실행하는 스크립트

Debian과 Ubuntu에서는 /etc/cron.d 안의 파일 중 이름에 점이 들어간 것은 무시되므로, backup.cron이 아니라 backup으로 이름 지으세요.

at

나중에 명령어를 한 번 실행

Linux#
at TIME | atq | atrm N
echo 'systemctl restart myapp' | sudo at 02:00

오늘 밤 새벽 2시

echo './report.sh' | at now + 30 minutes

30분 후

atq

대기 중인 작업

atrm 3

3번 작업 취소

at 패키지와 실행 중인 atd 서비스가 필요합니다.

systemd timers

cron 대신 systemd 타이머로 예약

Linux#
systemctl list-timers | <name>.timer with OnCalendar=
systemctl list-timers

모든 타이머와 다음 실행 시각

[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true

[Install]
WantedBy=timers.target

backup.service 옆에 backup.timer. Persistent는 꺼져 있던 동안 놓친 실행을 따라잡음

systemd-analyze calendar 'Mon..Fri 09:00'

OnCalendar 표현식의 의미 확인

sleep

다음 명령어 전에 대기

Linux · macOS#
sleep N[s|m|h|d]
sleep 5 && curl -s localhost:8080/health

서비스가 시작될 시간 주기

sleep 2m

단위 접미사는 GNU와 현재 macOS에서 작동

셸 기초(bash)

파이프, 리디렉션, 글로빙, 변수, 기록, 그리고 시간을 가장 많이 아껴 주는 키. macOS는 기본으로 zsh를 쓰며, shopt, help, bash 4 기능(macOS에는 bash 3.2가 들어 있음)을 빼면 거의 모두 그대로 작동합니다.

|

한 명령어의 출력을 다른 명령어로 보내기

Linux · macOS#
command1 | command2
ps aux | grep nginx

목록 거르기

history | grep 'docker run'

예전에 실행한 명령어 찾기

set -o pipefail

스크립트에서: 마지막뿐 아니라 어느 부분이든 실패하면 파이프라인 전체가 실패

> and >>

출력을 파일에 저장(덮어쓰기 또는 덧붙이기)

Linux · macOS#
command > file | command >> file
ls -l > listing.txt

덮어쓰기(파일 생성)

echo 'done' >> progress.log

덧붙이기

set -o noclobber

>가 기존 파일을 덮어쓰지 않게(>|는 강제)

셸은 명령어를 실행하기 전에 파일을 비우므로 sort file > file은 빈 파일만 남깁니다. 새 이름으로 쓴 뒤 mv하세요.

2> and 2>&1

오류, 또는 오류와 출력을 함께 리디렉션

Linux · macOS#
command 2> err.log | command > all.log 2>&1 | command &> all.log
find / -name x 2>/dev/null

오류 메시지 버리기

./build.sh > build.log 2>&1

출력과 오류를 한 파일에(순서 중요: > 먼저, 그다음 2>&1)

./build.sh &> build.log

같은 기능의 bash 축약형

<, <<EOF, <<<

파일, 텍스트 블록, 문자열을 입력으로 넘기기

Linux · macOS#
command < file | command <<'EOF' … EOF | command <<< "string"
mysql mydb < dump.sql

파일을 입력으로

cat > config.yml <<'EOF'
port: 8080
host: $HOST stays literal
EOF

'EOF'를 따옴표로 묶으면 $변수가 확장되지 않음

grep -c a <<< "banana"

히어 스트링

&& || ;

명령어를 조건에 따라 차례로 실행

Linux · macOS#
a && b | a || b | a ; b
make && sudo make install

빌드가 성공했을 때만 설치

cd /srv/app || exit 1

cd가 실패하면 스크립트 중단

(cd frontend && npm run build)

괄호: 서브셸이라 현재 디렉터리가 바뀌지 않음

$( ) $(( )) <( )

명령어 출력 사용 또는 산술 연산

Linux · macOS#
$(command) | $((expression)) | <(command)
echo "Today is $(date +%A)"

명령어 치환

echo $(( 1024 * 4 ))

정수 산술

diff <(ls dir1) <(ls dir2)

프로세스 치환: 출력을 임시 파일처럼

백틱 `command`는 $(command)의 옛 형태입니다. $( )는 중첩할 수 있고 읽기 쉽습니다.

* ? [ ] { }

와일드카드로 여러 파일 일치시키기

Linux · macOS#
* any string | ? one char | [abc] one of | {a,b} each word
ls *.jpg

이 폴더의 모든 JPG

rm photo-??.png

photo-01.png … photo-99.png

cp config.{yml,yml.bak}

중괄호 확장: cp config.yml config.yml.bak

shopt -s globstar; ls **/*.md

**는 모든 깊이와 일치(bash 4 이상)

글로브는 기본으로 점 파일과 일치하지 않습니다(shopt -s dotglob로 변경). 일치하는 것이 없으면 shopt -s nullglob가 설정되지 않은 한 bash는 패턴을 그대로 넘깁니다.

' ' vs " "

문자열과 변수를 올바르게 따옴표로 묶기

Linux · macOS#
'literal' | "expands $var and $(cmd)" | \ escapes one character
echo 'Cost: $5'

작은따옴표: 아무것도 확장되지 않음

echo "Home is $HOME"

큰따옴표: 변수는 확장되고 공백은 유지

cp "$file" "$dest/"

경로가 든 변수는 항상 따옴표로: 따옴표가 없으면 공백 때문에 깨짐

VAR=value

셸 변수 설정과 사용

Linux · macOS#
name=value (no spaces around =) | "$name" | "${name}"
name="Ada"; echo "Hi $name"

설정하고 사용

echo "${PORT:-8080}"

설정되지 않았거나 비어 있을 때 기본값

file=report.tar.gz; echo "${file%%.*}" "${file##*/}"

확장자 제거 / 디렉터리 제거

echo "${#name}"

문자열 길이

export

환경 변수 설정

Linux · macOS#
export NAME=value | NAME=value command | unset NAME
export NODE_ENV=production

이 셸에서 시작하는 모든 프로그램에 보임

DEBUG=1 ./app

그 명령어 하나에만

printenv | sort

목록 보기

unset DEBUG

삭제

셸이 끝나면 사라집니다. 유지하려면 export를 ~/.bashrc(대화형 셸)나 ~/.profile(로그인 셸)에 넣으세요.

$PATH

PATH에 폴더 추가

Linux · macOS#
export PATH="dir:$PATH"
echo "$PATH" | tr : '\n'

한 줄에 항목 하나

export PATH="$HOME/.local/bin:$PATH"

내 bin 폴더를 앞에 추가(~/.bashrc에 추가)

hash -r

바이너리를 옮긴 뒤 캐시된 명령어 위치 잊기

alias / source

단축 명령 만들기와 셸 설정 다시 불러오기

Linux · macOS#
alias name='command' | source file
alias ll='ls -alF'

유지하려면 ~/.bashrc에 추가

source ~/.bashrc

새 터미널을 열지 않고 변경 적용(. ~/.bashrc와 같음)

\ls

별칭을 우회해 진짜 ls 실행

$?

마지막 명령어가 성공했는지 확인

Linux · macOS#
echo $? (0 = success)
grep -q root /etc/passwd; echo $?

0 찾음, 1 못 찾음, 2 오류

set -euo pipefail

스크립트 맨 위: 오류, 설정되지 않은 변수, 실패한 파이프에서 중단

history, !!

이전 명령어 재사용

Linux · macOS#
history | !! | !$ | !N | !prefix | ^old^new
sudo !!

마지막 명령어를 sudo로 다시 실행

cd !$

이전 명령어의 마지막 인수 사용

!42

기록의 42번째 줄 다시 실행

^foo^bar

마지막 명령어에서 foo를 bar로 바꿔 다시 실행

HISTCONTROL=ignorespace(Ubuntu에서는 ignoreboth의 일부로 기본값)이면 앞에 공백을 넣고 입력한 명령어는 저장되지 않습니다. 비밀 정보가 든 명령어에 유용합니다.

Ctrl+R, Ctrl+A …

터미널 키보드 단축키(bash/readline)

Linux · macOS#
Emacs-style readline keys (the default)
Ctrl+R
기록을 역방향 검색. 다시 누르면 더 오래된 결과
Ctrl+A / Ctrl+E
줄 처음 / 끝
Ctrl+U / Ctrl+K
줄 처음까지 / 끝까지 잘라내기
Ctrl+W
이전 단어 잘라내기
Ctrl+Y
잘라낸 것 붙여넣기
Alt+B / Alt+F
한 단어 뒤로 / 앞으로
Alt+.
이전 명령어의 마지막 인수 삽입
Ctrl+L
화면 지우기
Ctrl+C
실행 중인 명령어 취소
Ctrl+D
입력 끝. 빈 줄에서는 셸 종료
Tab Tab
자동 완성 후보 보기
bind -P | less

모든 키 바인딩 목록

man / --help

아무 명령어의 도움말 보기

Linux · macOS#
man [section] cmd | cmd --help | help builtin | apropos word
man rsync

전체 매뉴얼. /로 검색, q로 종료

man 5 crontab

섹션 5: 명령어가 아니라 파일 형식

help cd

bash 내장 명령어에는 별도 man 페이지가 없음

apropos partition

어떤 명령어가 그 단어를 언급하는지

#!/usr/bin/env bash

셸 스크립트 작성과 실행

Linux · macOS#
#!/usr/bin/env bash, chmod +x, ./script.sh
#!/usr/bin/env bash
set -euo pipefail
name="${1:-world}"
if [[ -f "$name.txt" ]]; then
  echo "found $name.txt"
fi
for f in *.log; do
  echo "$f"
done

인수, 조건 검사, 반복문

chmod +x script.sh && ./script.sh Ada

실행 가능하게 만들고 실행

bash -x script.sh

실행되는 줄을 하나씩 추적

$1 … $9는 인수, "$@"는 전체 인수, $#는 인수 개수입니다. [[ ]]는 bash 문법이므로 POSIX sh 스크립트에서는 [ ]를 쓰세요.

clear / reset

깨진 터미널 지우기 또는 복구

Linux · macOS#
clear | reset
reset

바이너리 파일을 cat한 뒤 터미널에 이상한 문자가 나올 때

브라우저에서 실행되는 정적 참고 자료입니다. 검색어는 어디에도 전송되지 않습니다. 모든 무료 도구 보기.

문제를 발견하셨거나 개선할 점이 있나요? 모든 메시지를 읽고 빠르게 고칩니다.

이 Linux 명령어 치트 시트는 200개가 넘는 명령어를 하려는 작업별로 묶었습니다. 디렉터리 이동과 파일 관리, 권한, 프로세스, 디스크 공간, 네트워크, 패키지, 사용자, 압축 파일, 검색, 텍스트 처리, systemd 서비스와 로그, cron, 그리고 이 모든 것을 이어 주는 bash 기초까지 다룹니다. 각 항목에는 문법, 실제로 쓰게 될 옵션과 한 줄 설명, 복사 가능한 예시, 필요한 경우 경고가 있습니다. 작업(“디스크 여유 공간”, “8080 포트를 쓰는 프로세스”)이나 명령어 이름으로 검색하고, 원하는 항목에 바로 링크하세요.

옵션은 Ubuntu, Debian, Fedora, RHEL, Arch, openSUSE가 탑재하는 GNU coreutils, util-linux, procps-ng, iproute2, systemd, bash 매뉴얼을 따릅니다. macOS에서 다르게 동작하는 부분은 파란 메모로 설명합니다. sed -i, date -d, stat -c, xargs는 한쪽에서 쓴 스크립트가 다른 쪽에서 깨지는 대표적인 지점이기 때문입니다. 이 시트는 자주 쓰는 90%를 위한 참고 자료일 뿐 man 페이지를 대신하지는 않습니다. 드물게 쓰는 옵션은 여전히 man <command>가 정답입니다.

사용 방법

  1. 검색창에 작업이나 명령어를 입력하세요(/를 누르면 검색창으로 이동). 모든 단어가 일치해야 하므로 “tar extract”를 입력하면 tar 항목으로 좁혀집니다.
  2. 섹션 칩으로 네트워크나 패키지 같은 주제로 이동하거나, “위험한 명령어만”을 체크해 데이터를 지우거나 접속을 막을 수 있는 모든 명령어를 확인하세요.
  3. 예시 옆의 복사를 클릭한 다음, 샘플 파일 이름과 호스트를 자신의 것으로 바꾸세요.
  4. 항목 옆의 #를 클릭하면 /tools/linux-commands-cheat-sheet#rsync 같은 직접 링크를 얻을 수 있습니다.
  5. 인쇄 / PDF로 저장을 사용하면 사이트 메뉴 없이 간결한 2단 사본을 얻을 수 있습니다.

자주 묻는 질문

가장 먼저 배워야 할 Linux 기본 명령어는 무엇인가요?

이동과 파일부터 시작하세요: pwd, ls, cd, mkdir, cp, mv, rm, cat, less. 그다음 man(도움말), sudo, 검색용 grep과 find, 권한용 chmod와 chown, 프로세스용 ps, top, kill, 디스크 공간용 df와 du, 원격 접속용 ssh와 scp입니다. 파이프(|)와 리디렉션(>, >>)은 일찍 배우세요. 나머지 모든 것을 조합할 수 있게 해 줍니다.

Linux에서 디스크 공간은 어떻게 확인하나요?

df -h를 실행하면 마운트된 모든 파일 시스템의 여유 공간을 읽기 쉬운 단위로 볼 수 있습니다. 무엇이 공간을 차지하는지 찾으려면 디렉터리 안에서 du -h -d 1 | sort -h를 실행하세요. 하위 폴더를 가장 큰 것이 마지막에 오도록 나열합니다. df는 디스크가 가득 찼다는데 du로 아무것도 찾을 수 없다면, 삭제된 파일을 프로세스가 아직 열고 있을 가능성이 높습니다. sudo lsof +L1로 확인할 수 있습니다.

어떤 프로세스가 포트를 쓰는지 어떻게 찾나요?

sudo ss -tulpn을 실행하면 수신 대기 중인 모든 TCP·UDP 포트와 이를 소유한 프로그램이 나열되고, 포트 하나만 보려면 sudo lsof -i :8080을 쓰세요. sudo가 중요합니다. 없으면 내 프로세스의 이름만 보입니다. ss는 netstat을 대체했으며, netstat은 net-tools 패키지가 설치된 시스템에서 여전히 작동합니다.

kill과 kill -9의 차이는 무엇인가요?

kill PID는 SIGTERM을 보내 프로세스에 종료를 요청하고 정리할 기회를 줍니다. 파일을 플러시하고, 잠금을 해제하고, 연결을 닫을 수 있습니다. kill -9 PID는 SIGKILL을 보내는데, 커널이 즉시 강제하며 프로세스가 가로채거나 무시할 수 없으므로 정리가 전혀 이루어지지 않습니다. 먼저 일반 kill을 쓰고 몇 초 기다린 뒤, 그래도 무시하는 프로세스에만 -9를 쓰세요.

Mac에서 sed -i가 작동하지 않는 이유는 무엇인가요?

macOS에는 BSD sed가 들어 있는데, 여기서는 -i에 백업 확장자 인수가 필요합니다. macOS에서는 sed -i '' 's/old/new/g' file이라고 써야 하지만, Linux GNU sed에서는 같은 명령이 ''를 스크립트로 읽어 실패합니다. 양쪽에서 모두 작동하는 형태는 sed -i.bak 's/old/new/g' file이며, 나중에 지울 수 있는 백업 사본이 남습니다.

이 명령어들은 모든 Linux 배포판에서 같나요?

거의 모두 같습니다. 핵심 도구는 어디서나 같은 GNU와 util-linux 프로젝트에서 나오기 때문입니다. 다른 것은 패키지 관리자(Debian과 Ubuntu는 apt, Fedora와 RHEL은 dnf, Arch는 pacman, openSUSE는 zypper이며 패키지 표에 나란히 표시), 일부 로그 파일 경로, 관리자 그룹(sudo와 wheel), 방화벽 프런트엔드(ufw와 firewalld)입니다. Alpine과 BusyBox 기반 시스템은 옵션이 더 적은 축소판 도구를 씁니다.

시스템을 망가뜨릴 수 있는 명령어와 이를 막는 습관

피해의 거의 전부는 몇 안 되는 명령어에서 나옵니다. 경로가 틀렸거나 비어 있는 rm -rf, 엉뚱한 디스크를 가리킨 dd나 mkfs, 시스템 디렉터리에 쓴 chmod -R 777이나 chown -R, 원본과 대상이 뒤바뀐 rsync --delete나 robocopy식 미러링, crontab -e 대신 친 crontab -r, -a 없이 쓴 usermod -G, 잘못된 위치에 -delete를 둔 find입니다. 시트에서 각각을 위험으로 표시하고 구체적으로 어떻게 잘못되는지 설명합니다.

대부분을 막아 주는 습관은 해가 없는 버전을 먼저 실행하는 것입니다. rm -rf 전에는 같은 경로로 ls를 실행하세요. find … -delete 전에는 같은 find를 -print로 실행하세요. rsync --delete 전에는 -n을 붙여 시험 실행하세요. dd나 mkfs 전에는 lsblk를 실행하고 장치 이름을 두 번 읽으세요. 스크립트에서는 $DIR 대신 ${DIR:?}를 쓰면, 변수가 비어 있을 때 경로가 /로 바뀌는 대신 스크립트가 중단됩니다.

셸 설정 두 가지도 도움이 됩니다. 스크립트 맨 위의 set -euo pipefail은 잘못된 상태로 계속 진행하는 대신 첫 오류에서 멈추게 하고, set -o noclobber는 >가 기존 파일을 덮어쓰지 않게 합니다.

GNU와 macOS(BSD): 같은 명령어가 다르게 동작하는 곳

macOS는 유닉스이지만 명령줄 도구는 GNU가 아니라 FreeBSD에서 왔기 때문에, Linux 튜토리얼에서 명령어를 복사할 때 바로 차이가 드러납니다.

• macOS의 sed -i는 인수가 필요합니다(sed -i '' …). -i.bak은 양쪽에서 작동합니다.

• macOS의 date에는 -d가 없습니다. 타임스탬프 변환은 date -r <epoch>, 상대 날짜는 date -v-2d를 쓰세요.

• stat은 GNU의 -c 대신 다른 서식 문자를 쓰는 -f를 사용합니다.

• macOS의 xargs는 입력이 비어 있으면 기본적으로 건너뛰지만, GNU xargs는 -r을 주지 않으면 명령을 한 번 실행합니다.

• du는 양쪽 모두 -d 1을 받지만 --max-depth는 GNU만 받습니다. macOS의 ps에는 --sort가 없습니다(ps aux -m이나 -r을 쓰세요).

• head -n -5, tac, free, ip, ss, timeout, watch는 기본 macOS에 없습니다.

Mac에서 GNU 동작이 필요하다면 Homebrew의 coreutils, gnu-sed, findutils 패키지가 g 접두사를 붙인 GNU 버전(gsed, gdate, gstat, gxargs)을 설치해 줍니다.

권한 읽기와 알맞은 chmod 고르기

ls -l은 권한을 -rwxr-x---처럼 열 글자로 보여 줍니다. 첫 글자는 유형(- 파일, d 디렉터리, l 링크)이고, 나머지 아홉 글자는 소유자, 그룹, 기타 사용자에 대한 읽기·쓰기·실행 권한 세 묶음입니다. 숫자로는 r이 4, w가 2, x가 1이며 묶음별로 더하므로 rwxr-x---는 750입니다.

일반적인 모드: 보통 파일은 644, 디렉터리와 스크립트는 755, 개인 키와 비밀 정보가 담긴 파일은 600, ~/.ssh 같은 개인 디렉터리는 700입니다. 디렉터리에서 x는 ‘들어갈 수 있음’을 뜻하므로, 디렉터리에는 필요하고 일반 파일에는 필요 없습니다. 적용하기 전에 모드를 확인하고 싶다면 chmod 계산기로 기호 형식과 8진수 형식을 서로 변환할 수 있습니다.

관련 무료 도구

  • CMD vs PowerShell vs Bash — 같은 작업을 명령 프롬프트, PowerShell, bash에서 나란히 비교: 파일, grep, 환경 변수, 프로세스, 네트워크, 서비스, 스크립팅.
  • Chmod 계산기 — 읽기, 쓰기, 실행 체크박스를 선택해 8진수 모드와 chmod 명령어를 얻거나, 755, 644, rwxr-xr-x를 해석하세요.
  • Cron 표현식 생성기 — 드롭다운으로 cron 일정을 만들거나 붙여 넣어 쉬운 말로 읽고, 다음 실행 10회를 내 시간대와 UTC로 확인하세요. 무료, 브라우저에서 실행.
  • 서브넷 계산기 — 모든 CIDR의 네트워크, 브로드캐스트, 호스트 범위, 마스크를 계산하고, VLSM으로 네트워크를 나누고, IPv6를 확장하고, 겹치는 범위를 찾으세요.
  • Git 치트 시트 — 마지막 커밋 취소, 브랜치 이름 변경, 원격 브랜치 삭제처럼 하려는 작업별로 정리한 Git 명령어. 최신 switch/restore와 기존 명령어, 위험 배지까지 함께 보여 줍니다.