본문 바로가기
DevOps/Linux

[DevOps] Linux 명령어 (기본) 쉽게 이해하기

by SeungyubLee 2025. 12. 9.

※ 경로 기본 개념

/              # 루트 디렉토리(최상위 경로)
.              # 현재 디렉토리
..             # 상위 디렉토리
~              # 홈 디렉토리(/home/username)
/path1/path2   # 절대경로(현재 위치와 무관하게 항상 동일한 위치를 가리킴, 루트 디렉토리부터의 경로)
./             # 현재 디렉토리에 있는 파일을 실행하거나 접근할 때 사용(예:./start.sh)
               # 현재 디렉토리는 PATH에 포함되지 않기 때문에 경로를 직접 지정해야 실행 가능

 

※ ls (목록 조회)

숨김(-a), 상세(-l), 용량 가독성(-h), 시간 기준 정렬(-t)

ls
# (현재 위치) 현재 디렉토리의 파일/디렉토리(폴더) 목록 조회

ls /var/log
# (어디서나) 절대경로 /var/log 내부 목록 조회

ls -alht
# (현재 위치) 숨김, 상세, 용량 가독성, 시간 기준 정렬 옵션을 조합한 상세 목록 조회

ls -alht /etc
# (어디서나) 숨김, 상세, 용량 가독성, 시간 기준 정렬 옵션을 조합한 절대경로 /etc 내부 상세 목록 조회

 

※ pwd (현재 위치한 디렉토리 경로 확인)

pwd
# (어디서나) 현재 위치한 디렉토리의 절대경로 출력

 

 cd (디렉토리 이동)

cd ./scripts
# (현재 위치) 현재 디렉토리 안의 scripts 디렉토리로 이동

cd /usr/local/bin
# (어디서나) 절대경로 /usr/local/bin 디렉토리로 이동

cd ~/project
# (어디서나) 홈 디렉토리 기준 project 디렉토리로 이동

 

 mkdir (디렉토리 생성)

중간 경로 자동 생성(-p)

mkdir test
# (현재 위치) test라는 새 디렉토리 생성
mkdir -p a/b/c
# (현재 위치) 상위 디렉토리가 없어도 자동으로 a → b → c 순서로 모두 생성
mkdir -p /var/www/logs
# (어디서나) 지정한 절대경로에 logs까지 전체 디렉토리 구조를 한 번에 생성

 

 rm (파일/디렉토리 삭제)

디렉토리 삭제(-r), 강제 삭제(-f), 삭제 전 확인(-i)

rm file.txt
# (현재 위치) file.txt 파일 삭제
rm /tmp/file.txt
# (어디서나) 절대경로 /tmp/ 내부에 있는 file.txt 파일 삭제
rm -r folder
# (현재 위치) folder 디렉토리 및 내부 모든 파일/디렉토리 삭제
rm -r /var/log/old
# (어디서나) 절대경로 /var/log/ 내부에 있는 old 디렉토리 삭제
rm -rf folder
# (현재 위치) folder 디렉토리를 강제 삭제 ※ 매우 위험

 

 cp (복사)

디렉토리 재귀 복사(-r), 덮어쓰기 전 물어보기(-i), 원본 권한/시간 보존(-p)

cp a.txt b.txt
# (현재 위치) a.txt를 b.txt 이름으로 복사
cp /tmp/a.txt .
# (어디서나) 절대경로 /tmp/ 내부에 있는 a.txt 파일을 현재 위치(.)로 복사
cp -r src backup
# (현재 위치) src 디렉토리를 backup 디렉토리로 재귀 복사
cp -r /var/www /backup/
# (어디서나) /var/ 내부에 있는 www 디렉토리를 /backup/ 안에 그대로 복사

 

 mv (이동&이름 변경)

덮어쓰기 전 확인(-i), 강제 덮어쓰기(-f)

mv a.txt b.txt
# (현재 위치) a.txt 파일의 이름을 b.txt로 변경
mv a.txt /tmp/
# (현재 위치) a.txt 파일을 /tmp/ 디렉토리로 이동
mv /tmp/a.txt .
# (어디서나) 절대경로 /tmp/a.txt 파일을 현재 위치로 이동

 

 cat (파일 내용 출력)

cat file.txt
# (현재 위치) file.txt 파일의 전체 내용을 한 번에 출력
cat /var/log/syslog
# (어디서나) 절대경로 /var/log/ 내부에 있는 syslog 파일 내용 출력

 

 tail (실시간 로그 모니터링)

줄 수 지정(-n), 실시간 출력(-f)

tail -f app.log
# (현재 위치) app.log의 마지막 부분을 실시간으로 계속 출력
tail -n 100 -f app.log
# (현재 위치) app.log의 마지막 100줄을 먼저 출력하고 이후 변경 내용을 실시간으로 출력
tail -f /var/log/nginx/error.log
# (어디서나) 절대경로 /var/log/nginx/ 내부에 있는 error.log 실시간 모니터링

 

 less (긴 파일 보기)

less log.txt
# (현재 위치) 긴 파일을 페이지 단위로 스크롤하며 읽기(q로 종료)
less /etc/nginx/nginx.conf
# (어디서나) 절대경로 /etc/nginx/ 내부에 있는 nginx.conf 설정 파일을 스크롤 방식으로 열람

 

which (PATH에 등록된 명령어 실행 파일 경로 확인)

which ssh
# (어디서나) ssh 실행 파일 경로 출력
# 경로가 출력된다는 건 실행 파일이 PATH 안에 있어서 터미널에서 명령어 이름만 입력해도 바로 실행 준비가 된다는 의미
# ssh, scp, java, mysql, hbase, nginx, docker, ls 등 실행 파일 경로 확인 가능
# 단, 실행 파일이 PATH 안에 있을 때만 출력되며, 설치되지 않았거나 PATH에 등록되지 않은 경우에는 출력되지 않음

 

 grep (문자열 검색)

대소문자 무시(-i), 디렉토리 재귀 검색(-r), 줄 번호 표시(-n)

grep "ERROR" app.log
# (현재 위치) app.log 파일에서 문자열 ERROR 포함된 줄 출력
grep -r "ERROR" .
# (현재 위치) 현재 디렉토리(.)와 그 하위 모든 디렉토리에서 문자열 ERROR 재귀 검색
grep "ERROR" /var/log/syslog
# (어디서나) 절대경로 /var/log/ 내부에 있는 syslog 파일에서 문자열 ERROR 검색
grep -r "ERROR" /var/log/
# (어디서나) 절대경로 /var/log/ 디렉토리와 그 하위 모든 파일 및 디렉토리에서 문자열 ERROR 재귀 검색

 

 find (파일 검색)

find . -name "*.log"
# (현재 위치) 현재 디렉토리 이하에서 모든 로그 파일 검색
find / -name "*.log"
# (어디서나) 시스템 전체에서 모든 로그 파일 검색

 

 top (실시간 시스템 모니터링)

top
# (어디서나) CPU·메모리·프로세스를 실시간으로 모니터링

 

 df/du (디스크 사용량 확인)

df:사람이 읽기 쉬운 단위(-h)

du:총합 표시(-s), 사람이 읽기 쉬운 단위(-h), Depth 제한(-d)

df -h
# (어디서나) 전체 파일 시스템 사용량 표시
du -sh *
# (현재 위치) 각 파일/디렉토리의 용량 합계 출력
du -sh /var/log/*
# (어디서나) 절대경로 /var/log/ 내부 항목의 용량을 한 번에 확인

 

 ps/kill (프로세스 관리)

ps:모든 프로세스(-e), Full Format(-f)

kill:강제 종료(-9), 정상 종료(-15)

ps -ef
# (어디서나) 현재 실행 중인 모든 프로세스 목록 출력
ps -ef | grep java
# (어디서나) java 관련 프로세스만 필터링
kill 1234
# (어디서나) PID 1234 프로세스 종료
kill -9 1234
# (어디서나) PID 1234 프로세스 강제 종료 ※ 일반 종료가 안될 때 사용

 

sudo (관리자 권한으로 명령 실행)

root 로그인 shell(-i), 다른 사용자로 명령 실행(-u), sudo 인증 정보 초기화(-k), sudo 권한 목록 보기(-l), sudo 인증 갱신(-v)

sudo <명령어>
# 명령어를 root 권한으로 실행(설치·설정 변경 등 시스템 작업에 사용)

sudo -i
# root의 로그인 shell 환경으로 진입(PATH·환경 변수·홈 디렉토리 적용)
# su - 와 비슷하나 sudo 기반이므로 보안적으로 더 안전

sudo -u nginx whoami
# nginx 사용자 권한으로 명령 실행

sudo -k
# 캐시된 sudo 인증 정보 초기화 → 다음 sudo 실행 시 비밀번호 요구

sudo -l
# 현재 계정에 허용된 sudo 명령 목록 조회

 

 su (사용자 전환)

로그인 shell로 전환(-), 명령 1회 실행(-c), shell 지정(-s), 환경 변수 유지(-m)

su -
# root 계정의 로그인 shell로 전환(환경 변수 포함)

su - postgres
# postgres 사용자로 로그인 환경까지 적용하여 전환(DB 서버에서 자주 사용)

su -c "systemctl status nginx" root
# root로 로그인하지 않고 명령 1회만 실행

 

 네트워크 관련

ping google.com
# (어디서나) google.com 네트워크 연결 상태 확인
curl https://naver.com
# (어디서나) https://naver.com에 HTTP(S) 요청을 보내고 서버에서 받은 응답 본문을 터미널에 출력
curl -I https://naver.com
# (어디서나) https://naver.com에 HEAD 요청을 보내 응답 헤더만 조회(상태코드, 서버 정보 확인)
ss -tlnp
# (어디서나) TCP 기반으로 열려 있는 포트 목록과 해당 포트를 사용하는 프로세스를 확인

 

 권한/사용자

chmod 600 key.pem
# (현재 위치) key.pem 파일을 '소유자만 읽기/쓰기' 가능하도록 제한
chmod 600 /home/ubuntu/key.pem
# (어디서나) 절대경로 /home/ubuntu/ 내부에 있는 key.pem 파일 권한 변경 '소유자만 읽기/쓰기'
chown userA:groupA file.txt
# (현재 위치) file.txt 파일의 소유자를 userA로, 그룹을 groupA로 변경
chown root:groupA /etc/nginx/nginx.conf
# (어디서나) 절대경로 /etc/nginx/ 내부에 있는 nginx.conf 파일의 소유자를 root로, 그룹을 groupA로 변경

 

권한 숫자 기호 표기 (소유자, 그룹, 기타) 의미 주 용도
600 rw------- 소유자 읽기/쓰기 SSH Private Key, 민감 파일
400 r-------- 소유자 읽기 설정파일 읽기 전용
644 rw-r--r-- 소유자 읽기/쓰기, 그룹과 기타 읽기 일반 텍스트/웹 파일
640 rw-r----- 소유자 읽기/쓰기 , 그룹 읽기 로그파일 공유, 권한 분리
700 rwx------ 소유자 읽기/쓰기/실행 개인 스크립트/디렉토리
755 rwxr-xr-x 소유자 읽기/쓰기/실행 , 그룹과 기타 읽기/실행 실행 스크립트, 웹 디렉토리
775 rwxrwxr-x 소유자와 그룹 읽기/쓰기/실행, 기타 읽기/실행 협업 폴더
777 rwxrwxrwx 모두 읽기/쓰기/실행 절대 비추천(보안 위험)

 

 서비스 관리

sudo systemctl status nginx
# (nginx 설치 서버에서) nginx 서비스 상태 확인
sudo systemctl restart nginx
# (nginx 설치 서버에서) nginx 서비스 재시작

 

 SSH 접속

포트 번호 지정(소문자 -p), Private Key 파일 지정(-i), 접속 과정 상세 출력(-v)

 

▶ SSH 기본 접속

ssh user@203.0.113.10
# (로컬) user 계정으로 203.0.113.10 서버에 SSH 접속

 

▶ SSH + 키파일(.pem)

ssh -i mykey.pem user@203.0.113.10
# (로컬) 비밀번호 대신 pem 개인키로 인증 후 접속

 

▶ SSH + 포트 번호 지정

ssh -p 10022 user@203.0.113.10
# (로컬) SSH 포트 번호가 10022일 때 접속
ssh -i mykey.pem -p 10022 user@203.0.113.10
# (로컬) 키파일 + 포트 번호를 함께 지정한 SSH 접속

 

 

 SCP 파일 전송 (SSH 기반)

포트 번호 지정(대문자 -P), Private Key 파일 지정(-i), 디렉토리 재귀 복사(-r), 전송 과정 상세 출력(-v)

 

▶ 로컬 → 원격 업로드

scp file.txt user@192.168.10.10:/home/user/
# (로컬) 로컬 file.txt를 원격 서버 192.168.10.10의 절대경로 /home/user/에 업로드
scp -P 10022 file.txt user@192.168.10.10:/home/user/
# (로컬) 로컬 file.txt를 SSH 포트 번호가 10022인 원격 서버 192.168.10.10의 절대경로 /home/user/에 업로드

 

▶ 원격 → 로컬 다운로드

scp user@192.168.10.10:/var/log/app.log ./
# (로컬) 원격 서버 192.168.10.10의 절대경로 /var/log/ 내부에 있는 app.log를 현재 디렉토리로 다운로드
scp -P 10022 user@192.168.10.10:/var/log/app.log ./
# (로컬) SSH 포트 번호가 10022인 원격 서버 192.168.10.10의 절대경로 /var/log/ 내부에 있는 app.log를 현재 디렉토리로 다운로드

 

▶ 원격 → 원격

scp userA@192.168.10.10:/var/log/app.log userB@192.168.10.20:/backup/
# (로컬) 원격 서버 192.168.10.10의 절대경로 /var/log/ 내부에 있는 app.log를 복사해 원격 서버 192.168.10.20의 절대경로 /backup/ 디렉토리 안에 붙여넣기
# 한쪽이라도 기본 SSH 포트 번호(22)가 아닌 다른 포트를 지정해야 한다면 SCP 한 줄 명령으로는 불가능하며, 로컬을 거치거나 원격 서버에 접속해 SCP를 실행해야 함
# IP 대신 도메인 주소 사용 가능