실무에서 자주 쓰는 Linux 명령어
각종 명령어
파일 및 권한
mkdir -p
mkdir는 디렉토리를 생성하는 명령어이다.
-p 옵션을 주면 중간 경로가 없을 경우 함께 생성하고, 이미 존재하더라도 에러를 내지 않는다.
mkdir -p /data/app/logs
/data와 /data/app이 없더라도 한 번에 생성된다.
chmod
chmod는 파일이나 디렉토리의 권한을 변경하는 명령어이다.
Linux의 권한은 소유자(u) / 그룹(g) / 그 외(o) 각각에 대해 읽기(r) / 쓰기(w) / 실행(x)으로 구성된다.
-rwxr-xr-- 1 appuser appgroup 1024 Oct 2 10:00 start.sh
└┬┘└┬┘└┬┘
u g o
각 권한은 숫자로 표현할 수 있다.
| 권한 | 숫자 |
|---|---|
r | 4 |
w | 2 |
x | 1 |
이 숫자를 더한 값을 u, g, o 순서로 나열한다.
| 표기 | 의미 | 대표적인 사용처 |
|---|---|---|
755 | rwxr-xr-x | 실행 스크립트, 디렉토리 |
644 | rw-r--r-- | 일반 설정 파일 |
600 | rw------- | 개인키, 인증 정보 파일 |
700 | rwx------ | ~/.ssh 디렉토리 |
chmod 755 start.sh
chmod +x start.sh
chmod -R 750 /opt/myapp
+x처럼 기호로 권한을 추가/제거할 수도 있다. (u+x,g-w,o-r등)-R옵션은 하위 디렉토리와 파일까지 재귀적으로 적용한다.
- 디렉토리에서
x권한은 '실행'이 아니라 해당 디렉토리 안으로 진입할 수 있는 권한이다. r만 있고x가 없으면cd로 들어갈 수 없다.
권한과 함께 자주 쓰는 것이 소유자를 변경하는 chown이다.
chown appuser:appgroup start.sh
chown -R appuser:appgroup /opt/myapp
프로세스 및 네트워크
ps -ef
ps는 현재 실행 중인 프로세스를 확인하는 명령어이다.
-e는 모든 프로세스, -f는 상세 형식(Full format)으로 출력하라는 옵션이다.
ps -ef | grep java
UID PID PPID C STIME TTY TIME CMD
appuser 2314 1 2 09:12 ? 00:01:43 /usr/bin/java -Xms1g ...
| 컬럼 | 의미 |
|---|---|
UID | 프로세스를 실행한 계정 |
PID | 프로세스 ID |
PPID | 부모 프로세스 ID |
STIME | 프로세스 시작 시각 |
CMD | 실행된 명령어 전체 |
PPID가 1이라면 Systemd가 직접 실행했거나, 부모 프로세스가 종료되었지만, 종료되지 않은 고아 프로세스가 Systemd에 자식 프로세스로 편입된 프로세스이다.
ss -tulpn
ss는 소켓 상태를 확인하는 명령어이다. (기존 netstat을 대체)
실무에서는 '이 포트를 누가 쓰고 있는가'를 확인할 때 가장 많이 사용한다.
ss -tulpn | grep 8080
| 옵션 | 의미 |
|---|---|
-t | TCP 소켓 |
-u | UDP 소켓 |
-l | Listening 상태인 소켓만 |
-p | 소켓을 사용 중인 프로세스 표시 |
-n | 이름 변환 없이 숫자로 표시 (포트, IP) |
Netid State Local Address:Port Peer Address:Port Process
tcp LISTEN 0.0.0.0:8080 0.0.0.0:* users:(("java",pid=2314,fd=45))
Local Address가 127.0.0.1이라면 로컬에서만 접근 가능하고, 0.0.0.0 또는 *라면 모든 인터페이스에서 접근 가능하다는 의미이다.
-p옵션으로 프로세스 정보를 모두 보려면 root 권한이 필요하다.
nmcli
nmcli는 NetworkManager를 CLI로 제어하는 명령어이다.
RHEL 계열에서 IP, Gateway, DNS 등의 네트워크 설정은 nmcli로 하는 것이 표준이다.
nmcli에서는 다음 두 개념을 구분해야 한다.
| 구분 | 의미 |
|---|---|
| Device | 실제 네트워크 인터페이스 (ens192, eth0 등) |
| Connection | Device에 적용할 설정 프로파일 |
상태 확인
nmcli device status
nmcli connection show
nmcli connection show ens192
고정 IP 설정
nmcli connection modify ens192 ipv4.method manual
nmcli connection modify ens192 ipv4.addresses 192.168.0.10/24
nmcli connection modify ens192 ipv4.gateway 192.168.0.1
nmcli connection modify ens192 ipv4.dns 8.8.8.8
nmcli connection modify ens192 connection.autoconnect yes
nmcli connection up ens192
modify는 프로파일만 수정하는 것이기 때문에, nmcli connection up을 실행해야 실제 인터페이스에 반영된다.
설정 이후에는 ip addr, ip route로 결과를 확인한다.
기타
ssh-keygen
ssh-keygen은 SSH 접속에 사용할 공개키/개인키 쌍을 생성하는 명령어이다.
ssh-keygen -t rsa -b 4096
ssh-keygen -t ed25519
실행하면 ~/.ssh/ 아래에 두 개의 파일이 생성된다.
| 파일 | 의미 |
|---|---|
id_rsa | 개인키. 절대 외부에 노출하면 안 된다 |
id_rsa.pub | 공개키. 접속할 대상 서버에 등록한다 |
이후 공개키를 대상 서버에 등록하면 비밀번호 없이 접속할 수 있다.
ssh-copy-id user@192.168.0.20
ssh-copy-id는 대상 서버의 ~/.ssh/authorized_keys에 공개키를 추가해주는 명령어이다.
- SSH는 권한이 느슨하면 키를 무시한다.
~/.ssh는700,~/.ssh/authorized_keys와 개인키는600이어야 한다.
base64
base64는 바이너리 데이터를 ASCII 문자열로 인코딩/디코딩하는 명령어이다.
echo -n 'admin' | base64
echo 'YWRtaW4=' | base64 -d
YWRtaW4=
admin
여기서 주의할 점이 두 가지 있다.
첫번째로, echo에는 -n 옵션을 붙여야 한다.
echo는 기본적으로 문자열 끝에 개행 문자를 붙인다.-n없이 인코딩하면 개행까지 포함되어YWRtaW4K라는 다른 값이 나온다.
두번째로, Base64는 암호화가 아니라 인코딩이다.
- 누구나
base64 -d로 원본을 복원할 수 있다. - 쿠버네티스 Secret의 값이 Base64로 되어 있다고 해서 안전하게 보호되는 것이 아니다.
긴 값을 인코딩하면 76자마다 줄바꿈이 들어가는데,
base64 -w 0옵션으로 줄바꿈 없이 출력할 수 있다.
vi
vi의 모드
vi는 모드를 전환하면서 사용하는 텍스트 편집기이다.
| 모드 | 역할 | 진입 방법 |
|---|---|---|
| 명령 모드 | 커서 이동, 삭제, 복사, 붙여넣기 | Esc |
| 입력 모드 | 텍스트 입력 | i, a, o 등 |
| Ex 모드 | 저장, 종료, 치환, 설정 | 명령 모드에서 : |
vi를 처음 열면 명령 모드이다.
입력 모드 진입
| 키 | 동작 |
|---|---|
i | 커서 위치에서 입력 |
a | 커서 다음 위치에서 입력 |
o | 아래에 새 줄을 만들고 입력 |
O | 위에 새 줄을 만들고 입력 |
A | 줄의 끝에서 입력 |
저장 및 종료
| 명령어 | 동작 |
|---|---|
:w | 저장 |
:q | 종료 |
:wq | 저장 후 종료 |
:q! | 저장하지 않고 강제 종료 |
:w! | 읽기 전용 파일 강제 저장 |
커서 및 화면 이동
| 키 | 동작 |
|---|---|
h j k l | 좌 / 하 / 상 / 우 |
w / b | 다음 단어 / 이전 단어 |
0 / $ | 줄의 시작 / 줄의 끝 |
gg / G | 파일의 처음 / 파일의 끝 |
:n 또는 nG | n번째 줄로 이동 |
Ctrl + f | 한 화면 아래로 (forward) |
Ctrl + b | 한 화면 위로 (backward) |
Ctrl + d | 반 화면 아래로 (down) |
Ctrl + u | 반 화면 위로 (up) |
긴 로그나 설정 파일을 볼 때는 Ctrl + f / Ctrl + b로 넘기고, 끝으로 바로 가려면 G를 쓰는 것이 가장 빠르다.
편집
| 키 | 동작 |
|---|---|
x | 커서 위치의 문자 1개 삭제 |
dd | 현재 줄 삭제 (잘라내기) |
5dd | 현재 줄부터 5줄 삭제 |
d$ | 커서 위치부터 줄 끝까지 삭제 |
dG | 현재 줄부터 파일 끝까지 삭제 |
yy | 현재 줄 복사 |
p | 커서 아래에 붙여넣기 |
u | 실행 취소 (undo) |
Ctrl + r | 다시 실행 (redo) |
v / V | 문자 단위 / 줄 단위 선택 (비주얼 모드) |
검색 및 치환
| 명령어 | 동작 |
|---|---|
/문자열 | 아래 방향으로 검색 |
?문자열 | 위 방향으로 검색 |
n / N | 다음 결과 / 이전 결과 |
:%s/old/new/g | 파일 전체에서 old를 new로 치환 |
:%s/old/new/gc | 치환할 때마다 확인 |
:noh | 검색 하이라이트 해제 |
:%s/old/new/g는 sed의 치환 문법과 동일하다. %는 파일 전체를 의미한다.
자주 쓰는 설정
| 명령어 | 동작 |
|---|---|
:set nu | 줄 번호 표시 |
:set nonu | 줄 번호 숨김 |
:set paste | 붙여넣기 모드 (자동 들여쓰기로 인한 깨짐 방지) |
:set list | 탭, 줄 끝 등 보이지 않는 문자 표시 |
YAML처럼 들여쓰기가 중요한 내용을 붙여넣을 때는 :set paste를 먼저 실행해야 들여쓰기가 계단식으로 밀리지 않는다.
sed
sed란?
sed(Stream Editor)는 파일이나 입력을 한 줄씩 읽으면서 텍스트를 치환, 삭제, 출력하는 명령어이다.
vi로 파일을 열지 않고도 설정 파일을 수정할 수 있기 때문에, 여러 서버에 동일한 설정을 적용하거나 설치 과정을 반복해야 할 때 많이 사용한다.
기본 문법
sed 's/찾을문자열/바꿀문자열/' 파일
| 형태 | 설명 |
|---|---|
sed 's/a/b/' file | 각 줄에서 처음 나오는 a를 b로 치환 |
sed 's/a/b/g' file | 각 줄의 모든 a를 b로 치환 |
sed -i 's/a/b/g' file | 결과를 파일에 직접 반영 |
sed -i.bak 's/a/b/g' file | 원본을 file.bak으로 백업한 뒤 반영 |
sed -n '5,10p' file | 5~10번째 줄만 출력 |
sed '/pattern/d' file | 패턴이 포함된 줄 삭제 |
sed '3d' file | 3번째 줄 삭제 |
sed '/pattern/ s/a/b/' file | 패턴이 포함된 줄에서만 치환 |
sed -e '...' -e '...' file | 여러 개의 명령을 순서대로 적용 |
여기서 중요한 점은 다음과 같다.
-i옵션이 없으면 결과를 화면에 출력만 하고, 파일은 변경되지 않는다.
따라서 먼저 -i 없이 실행하여 결과를 확인하고, 문제가 없으면 -i를 붙여 반영하는 것이 안전하다.
구분자 변경
치환할 문자열에 /가 포함되어 있으면 매번 \/로 이스케이프해야 해서 읽기 어려워진다.
이 경우 구분자를 다른 문자로 바꿀 수 있다.
sed -i 's|/opt/old|/opt/new|g' app.conf
s 바로 뒤에 오는 문자가 구분자가 된다. (|, #, @ 등)
정규표현식
sed의 '찾을 문자열'에는 정규표현식을 사용할 수 있다.
| 표현 | 의미 | 예시 |
|---|---|---|
^ | 줄의 시작 | ^# : #으로 시작하는 줄 |
$ | 줄의 끝 | ;$ : ;으로 끝나는 줄 |
. | 임의의 문자 1개 | a.c : abc, a1c 등 |
* | 바로 앞 문자가 0번 이상 반복 | ab* : a, ab, abb 등 |
.* | 임의의 문자열 | ^SELINUX=.* |
[abc] | 괄호 안의 문자 중 1개 | [0-9] : 숫자 1개 |
[^abc] | 괄호 안의 문자를 제외한 1개 | [^#] : #이 아닌 문자 |
\( \) | 그룹으로 묶음. \1, \2로 참조 | \(key\)=.* → \1=value |
& | 매칭된 문자열 전체 (바꿀 문자열에서 사용) | s/^/#&/ |
- sed는 기본적으로 기본 정규표현식(BRE)을 사용한다. 이 경우 그룹은
\( \), 1번 이상 반복은\+처럼\를 붙여야 한다. -E옵션을 주면 확장 정규표현식(ERE)을 사용한다. 이 경우( ),+,?,|를\없이 그대로 쓸 수 있다.
실무 예시
SELinux 비활성화
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
SELINUX=으로 시작하는 줄 전체를 SELINUX=disabled로 바꾼다.
swap 항목 주석 처리
sed -i '/ swap / s/^/#/' /etc/fstab
swap이 포함된 줄에서만, 줄의 시작(^)에 #을 붙인다.
주석 해제하면서 값 변경
sed -i 's/^#\(PermitRootLogin\).*/\1 yes/' /etc/ssh/sshd_config
#PermitRootLogin ... 형태의 줄을 PermitRootLogin yes로 바꾼다. \1은 그룹으로 묶은 PermitRootLogin을 가리킨다.
주석과 빈 줄을 제외하고 보기
sed -e '/^#/d' -e '/^$/d' /etc/chrony.conf