리눅스 필수 명령어 20가지 총정리: 초보자 터미널 사용법

3/17/2025 ·impact

리눅스 서버에 처음 접속하면 그래픽 화면 없이 프롬프트 한 줄만 남습니다. 이때부터 터미널 명령어가 사실상 유일한 조작 수단이 됩니다. 이 글은 리눅스를 처음 다루는 사람이 먼저 익혀야 할 명령어 20가지를 역할별로 묶고, 각 명령어가 실제로 무슨 일을 하는지 공식 man 페이지 설명을 근거로 정리한 것입니다. 이름만 나열하는 대신 자주 쓰는 옵션과 잘못 다뤘을 때 위험한 지점까지 같이 짚습니다.

리눅스 필수 명령어 20가지와 파일 조작의 기본

먼저 20가지를 한자리에 모아 두겠습니다. 아래 목록은 역할만 짧게 적은 것이고, 세부 옵션은 다음 구획부터 하나씩 풀어 씁니다.

  • ls : 디렉터리 내용 목록 출력
  • cd : 작업 디렉터리 이동
  • cp : 파일과 디렉터리 복사
  • mv : 이동 및 이름 변경
  • rm : 파일과 디렉터리 삭제
  • mkdir : 새 디렉터리 생성
  • grep : 파일 안의 문자열 검색
  • chmod : 파일과 디렉터리 권한 변경
  • echo : 텍스트 출력 또는 파일 저장
  • nano, vim : 터미널 환경 파일 편집
  • ssh : 원격 서버 접속
  • wget, curl : 파일 내려받기와 데이터 요청
  • df, du : 디스크 공간과 사용량 조회
  • ps, top : 프로세스와 리소스 현황 확인
  • tar, gzip, zip : 압축과 압축 해제
  • ifconfig, iptables, netstat : 네트워크 설정과 상태 점검
  • systemctl, journalctl : 서비스 관리와 시스템 로그 확인
  • crontab : 주기적 작업 예약
  • history : 실행한 명령어 기록 조회
  • sudo : 관리자 권한으로 명령 실행

이 중 손에 가장 많이 붙는 쪽은 파일을 만들고 옮기고 지우는 여섯 개입니다. cp는 cp man 페이지 설명대로 SOURCE를 DEST로, 또는 여러 SOURCE를 하나의 DIRECTORY로 복사합니다. 디렉터리를 통째로 복사하려면 -r이 필요하고, 소유권과 타임스탬프까지 유지하려면 -a를 씁니다. 같은 문서는 -a가 -dR --preserve=all과 같다고 적어 두었습니다. 덮어쓰기가 걱정되면 -i를 붙여 확인 절차를 넣습니다.

mkdir은 mkdir man 페이지에 따르면 -p를 붙였을 때 대상이 이미 있어도 오류를 내지 않고 필요한 상위 디렉터리까지 함께 만듭니다. rm은 rm man 페이지 설명대로 기본 상태에서는 디렉터리를 지우지 않으므로, 디렉터리를 없애려면 -r을 붙여야 합니다. 확인 옵션은 두 가지입니다. -i는 삭제할 때마다 묻고, -I는 파일이 세 개를 넘거나 재귀 삭제일 때 한 번만 묻습니다. -i가 번거롭다면 -I가 현실적인 절충안입니다.

# 중간 경로까지 한 번에 만들기
mkdir -p project/src/config

# 디렉터리를 통째로 복사
cp -r project project-backup

# 재귀 삭제 전에 한 번 확인받기
rm -I -r project-backup

검색과 권한 설정: grep, find, chmod

로그에서 특정 문자열을 찾는 일은 서버 작업에서 계속 반복됩니다. grep man 페이지는 -H가 일치한 줄마다 파일 이름을 출력하며, 검색 대상 파일이 둘 이상이면 이 동작이 기본값이라고 설명합니다. -n은 각 줄 앞에 해당 입력 파일 기준 1부터 시작하는 줄 번호를 붙입니다. -r은 각 디렉터리 아래 모든 파일을 재귀적으로 읽되 명령행에 직접 적은 심볼릭 링크만 따라가고, 재귀 도중 마주친 링크는 건너뜁니다. 링크를 전부 따라가려면 -R을 써야 합니다. 이 차이를 모르면 심볼릭 링크가 걸린 로그 디렉터리에서 결과가 비어 보일 수 있습니다.

파일 자체를 찾을 때는 find입니다. find man 페이지에서 -type f는 일반 파일을 뜻하고, -name은 앞쪽 디렉터리를 뗀 파일 이름이 셸 패턴과 맞는지 봅니다. 같은 문서는 패턴을 반드시 따옴표로 감싸라고 못 박습니다. 감싸지 않으면 셸이 현재 디렉터리에 있는 파일 이름으로 먼저 확장해 버리기 때문입니다. 시작 경로를 생략하면 현재 디렉터리인 .이 쓰입니다.

권한을 바꾸는 chmod는 두 가지 표기를 받습니다. chmod man 페이지에 따르면 기호 모드는 [ugoa...][[-+=][perms...]...] 형식이고, perms 자리에는 rwxXst 문자가 들어갑니다. u는 소유자, g는 같은 그룹의 사용자, o는 그 외 사용자, a는 전체를 가리킵니다. + 는 해당 비트를 더하고 - 는 빼며 = 는 지정한 비트만 남기고 나머지를 없앱니다. 숫자 모드는 4, 2, 1 비트를 더해 만든 한 자리에서 네 자리까지의 8진수이고, 생략한 자리는 앞의 0으로 봅니다. 재귀 적용 시 chmod가 디렉터리를 훑는 도중 만난 심볼릭 링크는 무시한다는 점도 같은 문서에 적혀 있습니다. 파일 내용을 직접 고칠 때는 echo로 텍스트를 파일에 저장하거나 nano, vim 같은 터미널 편집기를 씁니다.

원격 접속과 네트워크 점검: ssh, wget, curl

ssh는 ssh man 페이지의 표현대로 원격 머신에 로그인하고 원격에서 명령을 실행하는 프로그램이며, 신뢰할 수 없는 두 호스트 사이의 통신을 암호화하는 것이 목적입니다. 접속 대상은 [user@]hostname 형태나 ssh://[user@]hostname[:port] 형태로 적습니다. 포트를 바꾸려면 -p를 씁니다. 공개 키 인증은 ECDSA, Ed25519, RSA 알고리즘 가운데 하나를 쓰고, 공개 키를 원격 장비의 ~/.ssh/authorized_keys에 넣어 둡니다. 처음 접속하는 서버라면 서버 공개 키의 지문이 화면에 뜨는데, StrictHostKeyChecking을 꺼 두지 않은 한 이 확인 절차가 들어갑니다.

집에 실습용 리눅스 장비를 하나 두면 이 과정을 반복해서 익히기 좋습니다. 라즈베리파이4에 Ubuntu를 설치하고 SSH 원격 접속을 설정하는 과정을 정리한 글이 있으니, 접속해 볼 서버가 없다면 참고할 만합니다.

파일을 내려받을 때는 wget과 curl을 씁니다. wget man 페이지는 -r이 재귀 내려받기를 켜며 기본 최대 깊이가 5라고 적고 있습니다. --convert-links는 내려받기가 끝난 뒤 문서 안의 링크를 로컬에서 볼 수 있게 바꾸는데, 눈에 보이는 하이퍼링크뿐 아니라 이미지나 스타일시트처럼 외부를 참조하는 부분까지 대상입니다. 같은 문서는 wget이 robots.txt의 로봇 배제 표준을 존중한다고 밝힙니다. curl은 curl 매뉴얼 설명대로 URL을 써서 서버와 데이터를 주고받는 도구이며, HTTP와 HTTPS 외에 FTP, SFTP, SMTP, IMAP 등 여러 프로토콜을 다룹니다.

네트워크 상태 확인에 오래 쓰인 netstat는 사정이 조금 다릅니다. netstat man 페이지는 이 프로그램이 대체로 구식이라고 스스로 밝히면서, netstat의 대체는 ss, netstat -r의 대체는 ip route, netstat -i의 대체는 ip -s link, netstat -g의 대체는 ip maddr이라고 안내합니다. ss man 페이지를 보면 -t는 TCP 소켓, -u는 UDP 소켓을 표시하고 -l은 리스닝 소켓만 걸러 냅니다. -n은 서비스 이름을 해석하지 않으며 -p는 소켓을 쓰는 프로세스를 함께 보여 줍니다. 리스닝 소켓은 기본 출력에서 빠져 있으므로 -l을 명시해야 합니다. 이미 익힌 netstat를 버릴 필요는 없지만, 새로 배운다면 ss와 ip 쪽이 오래갑니다.

시스템 상태 확인과 서비스 관리

디스크가 찼는지 볼 때는 df와 du를 같이 씁니다. df man 페이지는 df가 인자로 준 파일이 속한 파일 시스템의 남은 공간을 보여 준다고 설명하고, -h는 1024의 거듭제곱 단위로 크기를 출력하며 -T는 파일 시스템 종류를 함께 냅니다. du man 페이지의 du는 지정한 파일들의 사용량을 디렉터리에 대해 재귀적으로 합산합니다. -s는 인자마다 총합만 내고, -a는 디렉터리뿐 아니라 모든 파일의 값을 냅니다. df가 파일 시스템 단위, du가 경로 단위라고 보면 됩니다.

프로세스는 ps와 top입니다. ps man 페이지는 옵션 표기가 세 갈래라고 설명합니다. 유닉스 옵션은 묶어 쓸 수 있고 앞에 대시가 붙으며, BSD 옵션은 묶어 쓰되 대시를 붙이지 않고, GNU 롱 옵션은 대시 두 개로 시작합니다. ps aux처럼 대시 없는 BSD 표기를 쓰면 기본 출력에 프로세스 상태가 추가되고 실행 파일 이름 대신 명령행 인자가 나오며, 내가 소유한 다른 터미널의 프로세스까지 선택 범위에 들어갑니다. top man 페이지의 top은 실행 중인 시스템을 실시간으로 보여 주고, 화면 갱신 간격은 -d로 바꿉니다. 소수점 초도 받지만 음수는 받지 않습니다.

압축은 tar, gzip, zip이 맡습니다. tar man 페이지는 tar를 여러 파일을 하나의 아카이브로 저장하고 그 아카이브를 다루는 프로그램으로 정의합니다. -c는 새 아카이브 생성, -x는 추출, -t는 목록 보기이고, -z는 아카이브를 gzip으로 거르며 -f는 아카이브 파일 이름을 지정합니다. -v를 붙이면 처리한 파일을 자세히 출력합니다.

서비스 관리는 systemctl과 journalctl입니다. systemctl man 페이지는 systemctl을 systemd 시스템 및 서비스 관리자의 상태를 살피고 제어하는 도구로 설명합니다. status는 시스템 전체나 지정한 유닛의 실행 상태와 가장 최근 저널 로그를 함께 보여 주고, start와 stop은 유닛을 활성화하거나 중지합니다. 헷갈리는 쪽은 enable입니다. 같은 문서는 enable이 심볼릭 링크를 만들 뿐 대상 유닛을 시작하지는 않으며, 활성화와 시작은 서로 직교한다고 명시합니다. 부팅 시 자동 시작을 걸어 두는 일과 지금 당장 실행하는 일은 별개라는 뜻입니다.

로그는 journalctl man 페이지 기준으로 systemd-journald가 저널에 쌓아 둔 항목을 출력합니다. -u는 지정한 유닛이나 패턴에 맞는 유닛의 메시지만 거르고, -f는 최근 항목부터 시작해 새 항목이 붙을 때마다 Ctrl-C를 누를 때까지 계속 출력합니다. 기간을 자를 때는 --since와 --until을 씁니다. 직접 만든 애플리케이션을 서비스로 올려 두면 이 조합이 그대로 운영 도구가 됩니다. FastAPI로 만드는 간단한 Todo List 앱 같은 결과물을 서버에 올린 뒤 상태와 로그를 확인하는 흐름이 그렇습니다.

주기 작업은 crontab입니다. crontab(1) man 페이지는 crontab을 크론 데몬이 쓰는 테이블 파일을 설치, 삭제, 조회하는 프로그램으로 설명합니다. -e는 VISUAL이나 EDITOR 환경 변수에 지정된 편집기로 현재 크론탭을 열고, -l은 표준 출력으로 보여 주며 -r은 삭제합니다. 시간 필드는 crontab(5) man 페이지에 따라 분 0-59, 시 0-23, 일 1-31, 월 1-12, 요일 0-7 순서이고 요일의 0과 7은 모두 일요일입니다. @daily 같은 축약 표기도 있는데, @daily는 0 0 *와 같습니다. 예전에 친 명령을 다시 찾을 때는 history로 실행 기록을 확인합니다.

실전 예제와 되돌릴 수 없는 명령어

아래는 실제 작업에서 자주 나오는 조합입니다.

# 현재 디렉터리에서 .conf 설정 파일 찾기
find . -type f -name "*.conf"

# 모든 로그파일에서 특정 에러 메시지 빠르게 찾기
grep -Hrn "Error" /var/log/

# 웹사이트 파일 전체 다운로드하여 로컬에 저장하기
wget -r --convert-links http://example.com

# SSH로 원격 서버 접속
ssh user@example.com

rm과 mv는 실행 전에 대상 경로를 다시 읽고 백업을 확보해 두는 편이 안전합니다. rm man 페이지는 삭제한 파일이라도 충분한 전문성과 시간이 있으면 내용 일부를 복구할 수 있다고 적어 두었는데, 뒤집어 보면 보통의 상황에서는 되돌리기 어렵다는 말이기도 합니다. 이름이 대시로 시작하는 파일은 옵션으로 오해받으므로, 같은 문서는 rm -- -foo나 rm ./-foo 형태로 지우라고 안내합니다.

chmod는 권한을 넓히는 방향으로 잘못 주면 시스템 보안 문제가 그대로 드러납니다. 숫자 모드에서 자리 수를 하나 빠뜨리면 의도와 전혀 다른 권한이 되기 쉬우니, 적용 전에 대상 범위를 확인하세요. 디렉터리 전체에 재귀로 거는 경우라면 더 그렇습니다.

sudo는 sudo man 페이지 설명대로 허가된 사용자가 보안 정책이 정한 범위 안에서 슈퍼유저나 다른 사용자 자격으로 명령을 실행하게 해 줍니다. 기본 보안 정책은 sudoers이고 /etc/sudoers 파일이나 LDAP으로 설정합니다. 같은 문서는 sudoers 정책이 인증 정보를 터미널 단위로 기본 5분간 캐시한다고 밝힙니다. 비밀번호를 한 번 넣은 뒤 잠시 다시 묻지 않는 이유가 이것입니다. 내가 어떤 권한을 가졌는지 모르겠다면 -l로 현재 호스트에서의 권한 목록을 먼저 확인하는 편이 낫습니다. 습관적으로 앞에 sudo를 붙이는 것이 가장 위험합니다.

라즈베리파이로 SSH 실습 환경 만들어 보기

정리

  • 파일 조작 여섯 개는 옵션까지 익혀 두기 (ls, cd, cp, mv, rm, mkdir)
  • 로그 추적은 grep -Hrn, 파일 탐색은 find -type f -name "패턴" 그리고 따옴표 필수
  • netstat 대신 ss와 ip, man 페이지가 직접 안내하는 대체 도구
  • systemctl의 enable과 start는 서로 직교, 부팅 자동 시작과 즉시 실행은 별개
  • rm과 sudo는 실행 전 경로와 권한 범위 재확인

출처: Linux man-pages 프로젝트, curl 매뉴얼