콘텐츠로 이동
Study Note서버 관리 일반

1. 명령을 읽는 법

명령을 외우는 것보다 모르는 명령을 5초 만에 알아내는 것이 오래 간다

이 장에서 처음 나오는 말5개
manmanual
시스템에 설치된 모든 명령·설정 파일의 공식 설명서. 인터넷보다 이 서버에 실제로 깔린 버전에 맞다는 것이 결정적 장점이다.
stdout / stderrstandard output / standard error
프로그램이 결과를 내보내는 통로 두 개. 정상 결과는 stdout(번호 1), 오류 메시지는 stderr(번호 2)로 나간다. 오류가 파이프를 안 타고 화면에만 남는 이유다.
종료 코드exit status / exit code
명령이 끝나면서 남기는 정수. 0이 성공, 그 외는 실패다. 화면에는 안 보이고 $?에 들어 있다 — 스크립트와 && 연결의 판단 근거다.
글로브glob
* · ? · […]로 파일 이름을 골라내는 셸의 패턴. 셸이 먼저 펼쳐서 명령에 넘긴다 — 정규식이 아니고, 따옴표로 감싸면 안 펼쳐진다.
PATH
실행 파일을 찾을 디렉터리 목록. sudo는 보안 때문에 자기만의 PATH(secure_path) 를 쓴다 — "일반 계정에선 되는데 sudo로는 command not found"의 정체다.
  1. 한 줄 설명부터 — 무슨 물건인지

    터미널 창
    whatis ss # ss (8) - another utility to investigate sockets
    apropos socket # 키워드로 관련 명령 찾기 (whatis -k와 같다)
  2. 빠른 사용법은 --help — man보다 짧고, 대부분의 명령이 지원한다

    터미널 창
    ss --help
    journalctl --help | less
  3. 정확한 것은 man — 옵션의 의미와 기본값이 여기 있다

    터미널 창
    man ss
    man 5 crontab # 섹션 지정 (아래 표)

    man 안에서는 /검색어 → n(다음) → q(종료). 이 셋이면 충분하다.

  4. 예제만 급하면 tldr — 커뮤니티가 쓴 사용 예 모음 (별도 설치)

    터미널 창
    sudo apt install -y tldr && tldr ss

같은 이름이 명령으로도, 설정 파일로도 존재하는 일이 흔하다. 그때 섹션 번호로 가른다.

섹션내용예
1일반 사용자 명령man 1 crontab — crontab -e 명령
5설정 파일 형식man 5 crontab — 크론 파일에 뭘 어떻게 쓰나
8관리자 명령 (root용)man 8 ss · man 8 useradd
7개념·규약man 7 hier — 디렉터리 구조 설명

man -a crontab은 섹션을 모두 순서대로 보여준다. man -k 는 apropos와 같다.

터미널 창
type ll # ll is aliased to `ls -alF' ← 별칭
type cd # cd is a shell builtin ← 셸 내장 (man cd가 없는 이유)
type -a python3 # 경로 전부. PATH에 여러 개 있을 때 어느 것이 잡히는지
command -v ss # 스크립트에서 "설치돼 있나" 확인용 (있으면 경로, 없으면 종료코드 1)

히스토리를 보다가 입력줄 비우기

섹션 제목: “히스토리를 보다가 입력줄 비우기”

위·아래 화살표로 이전 명령을 찾다가 새 명령을 처음부터 쓰고 싶다면, 현재 입력을 고칠 것인지 아예 취소할 것인지에 따라 단축키를 고른다. 아래 화살표로 최신 항목까지 왔는데도 글자가 남는 것은 히스토리 탐색을 시작하기 전에 입력하던 내용이 복원된 경우가 많다.

키동작언제 쓰나
Ctrl+U커서부터 줄 시작까지 삭제커서가 끝에 있을 때 현재 명령 전체를 지우고 다시 입력
Ctrl+A → Ctrl+K줄 시작으로 이동한 뒤 끝까지 삭제커서 위치와 관계없이 입력줄 전체를 확실히 삭제
Ctrl+C현재 입력을 취소하고 새 프롬프트 표시히스토리·여러 줄 입력 상태까지 버리고 완전히 다시 시작
Ctrl+L화면을 정리하되 현재 입력은 유지출력만 치우고 쓰던 명령은 계속 편집

따라서 기존 입력을 편집해서 다시 쓸 때는 Ctrl+U, 입력 자체를 버리고 새 프롬프트에서 시작할 때는 **Ctrl+C**가 기준이다. Ctrl+L은 입력줄 삭제가 아니라 화면 정리라는 점을 구분한다.

성공/실패는 화면 메시지가 아니라 종료 코드로 판정한다. 자동화의 전부가 여기 달려 있다.

터미널 창
systemctl is-active nginx
echo $? # 0이면 실행 중, 3이면 아님
연결의미
A && BA가 성공(0) 해야 B를 실행
A || BA가 실패해야 B를 실행
A ; B결과와 무관하게 순서대로
A & A를 백그라운드로 (터미널을 닫으면 대개 죽는다 — 4장)

관용구 두 개만 외운다 — apt update && apt upgrade(앞이 실패하면 진행하지 않는다), command -v mtr || sudo apt install -y mtr-tiny(없으면 설치).

출력 다루기 — 파이프와 리다이렉션

섹션 제목: “출력 다루기 — 파이프와 리다이렉션”
터미널 창
ss -tulpn | grep 443 # stdout을 다음 명령의 입력으로
dmesg > /tmp/dmesg.txt # 덮어쓰기 (>> 는 이어쓰기)
apt install foo 2> err.log # stderr만 파일로
make 2>&1 | tee build.log # stderr를 stdout에 합쳐 화면 + 파일 동시에
journalctl -u ssh | wc -l # 줄 수만
터미널 창
grep -rn "proxy" /etc/apt/ # 재귀(-r) + 줄번호(-n). "이 설정 어디 있지"의 답
grep -i -A3 -B1 error /var/log/syslog # 대소문자 무시 + 앞뒤 줄 같이
ps aux | awk '$3 > 50 {print $2, $11}' # CPU 50% 넘는 것의 PID와 명령
sort | uniq -c | sort -rn | head # 빈도 상위 — 로그 분석의 만능 꼬리
ss -tulpn | column -t # 열 정렬해서 읽기 좋게

긴 출력은 less -S(줄 안 접기)로 본다. 반복 확인은 watch -n1 'ss -s'. 오래 걸리는 명령에는 timeout 5 curl …로 상한을 건다 — 진단할 때 특히 유용하다.

sudo — 권한만 빌리는 게 아니다

섹션 제목: “sudo — 권한만 빌리는 게 아니다”

sudo는 환경변수와 PATH도 바꾼다. 이걸 모르면 프록시(9장) 설정에서 반드시 한 번 막힌다.

상황결과대처
sudo curl …인데 프록시를 안 탄다sudo가 http_proxy 환경변수를 버렸다sudo -E curl … 또는 sudoers의 env_keep
일반 계정은 되는데 sudo foo는 command not foundsudo의 secure_path에 그 디렉터리가 없다전체 경로로 실행 (sudo /usr/local/bin/foo)
sudo echo x > /root/f 가 Permission denied리다이렉션은 sudo 밖의 셸이 한다echo x | sudo tee /root/f
잠깐이 아니라 계속 root로—sudo -i(root의 환경까지) · sudo -s(현재 환경 유지)

sudo -l로 내가 무엇을 할 수 있는지 확인할 수 있다. 자세한 설정은 10장.

  • 되돌릴 수 없는 명령 앞에서는 목록부터 본다 — rm 전에 같은 조건으로 ls, find … -delete 전에 -print
  • --dry-run · -n을 먼저 찾는다 — rsync -n · apt -s upgrade · logrotate -d
  • 설정 파일은 고치기 전에 복사한다 — sudo cp /etc/ssh/sshd_config{,.bak-$(date +%F)} (중괄호 확장으로 sshd_config → sshd_config.bak-2026-08-10)
  • 문법 검사기가 있으면 쓴다 — sshd -t · nginx -t · visudo · netplan try
  • 원격에서 접속을 끊을 수 있는 작업은 tmux/screen 안에서 한다 — 세션이 끊겨도 명령은 계속 돈다
  • 모르는 명령은 whatis → --help → man 순서. 설정 파일 형식은 man 5
  • 성공/실패는 종료 코드 $?로 판정한다 — && · ||가 여기 붙는다
  • 오류가 파이프를 안 타면 stderr다 — 2>&1을 파이프 앞에 붙인다
  • sudo는 환경변수와 PATH를 갈아치운다 — sudo -E, 리다이렉션은 | sudo tee
  • 바꾸기 전에 ls · 백업 · --dry-run · 문법 검사