Tmux Plugins 2

Tmux 시리즈:

  1. Tmux Start (202605)
  2. Tmux Cheatsheet (202605)
  3. Tmux Plugins (202605)
  4. Tmux Plugins2

tmux-sensible

tmux-sensible은 tmux 사용자라면 거의 필수적으로 설치하는 최우선 플러그인입니다. 리눅스 커뮤니티의 거장인 Tim Pope가 개발한 것으로, “tmux의 기본 설정(Default)이 너무 보수적이고 불편하니, 누구나 동의할 만한 상식적인(Sensible) 옵션들로 기본값을 바꾸자”라는 목적으로 만들어졌습니다.

WSL(Ubuntu 24.04)과 원격 서버(Ubuntu 26.04)를 오가며 Windows Terminal로 작업하시는 사용자님의 환경에서, 이 플러그인이 왜 중요한지 핵심 역할과 미사용 시 불편한 점을 정리해 드립니다.


1. tmux-sensible이 자동으로 잡아주는 핵심 역할

이 플러그인을 설치하면 ~/.tmux.conf에 복잡한 코드를 일일이 적지 않아도 다음과 같은 강력한 기본 설정들이 적용됩니다.

  • 키 입력 지연 시간 제거 (escape-time 0): Vim/Neovim을 쓸 때 Esc 키를 누르면 즉시 모드가 바뀌도록 지연 시간을 없애줍니다.
  • 히스토리 버퍼 대폭 확장 (history-limit 50000): 터미널 로그를 위로 스크롤해서 볼 수 있는 줄 수를 기본 2,000줄에서 50,000줄로 대폭 늘려줍니다.
  • 256화면 색상 및 True Color 활성화: 윈도우 터미널 환경에서 현대적인 화려한 테마(NeoVim 내부 테마, 로고 등)가 깨지지 않고 정확한 색상으로 출력되도록 환경 변수를 잡아줍니다.
  • 단축키 반복 시간 최적화 (repeat-time 600): 윈도우나 팬 크기를 조절할 때 단축키를 너무 연속으로 누르지 않아도 부드럽게 작동하도록 조절합니다.

2. 이 플러그인을 쓰지 않을 때 발생하는 치명적인 불편함

만약 tmux-sensible 없이 순정 상태의 tmux를 사용하면 다음과 같은 짜증 나는 상황들을 겪게 됩니다.

① Vim 사용 시 Esc 키 지연 현상 (가장 고통스러움)

순정 tmux는 Esc 키가 입력된 후 0.5초(500ms) 동안 다음 키가 들어오는지 기다립니다. 이 때문에 Vim에서 수정 모드를 빠져나오려고 Esc를 누른 뒤 바로 방향키를 누르면, 모드가 풀리는 게 아니라 엉뚱한 명령 시퀀스로 인식되어 코드가 뒤죽박죽 꼬여버립니다.

② 윈도우 터미널에서 빔(Vim) 테마 색상 깨짐

최신 윈도우 터미널은 수백만 가지 색상(True Color)을 표현할 수 있습니다. 하지만 순정 tmux는 구시대적인 8색/16색 모드로 시작하는 경우가 많아, 고급스러운 개발자용 빔 테마를 켜도 색상이 칙칙하게 뭉개지거나 아예 가독성이 떨어지는 색으로 변해버립니다.

③ 조금만 빌드 로그가 길어져도 위쪽 내용이 잘림

앞서 LLM 관련 컴파일(llama.cpp 빌드 등)이나 대용량 로그를 출력할 때, 순정 tmux는 기본 버퍼가 2,000줄밖에 되지 않습니다. 컴파일 도중 에러가 나서 위로 스크롤(Ctrl + B[)을 해보면, 에러의 시작점이 이미 잘려 나가서 정작 중요한 에러 원인을 파악하지 못하는 상황이 발생합니다.

Ctrl + B 단축키 연속 입력의 피로감

순정 상태에서는 윈도우를 넘나들거나 팬을 다룰 때, 리눅스가 단축키 대기 시간을 너무 타이트하게 잡거나 반대로 너무 길게 잡아서 명령이 씹히는 느낌을 자주 받게 됩니다.


💡 요약 및 추천

tmux-sensible은 특이하고 기상천외한 기능을 추가해 주는 플러그인이 아닙니다. 단지 “당연히 이래야지” 싶은 현대적인 개발 환경 표준을 명령어 한 줄로 세팅해 주는 패키지입니다.


현재 경로의 디렉터리 트리 표시에 가장 널리 사용되는 tmux-sidebar 플러그인

.tmux.conf 에 등록하고 설치하면 된다.

1
set -g @plugin 'tmux-plugins/tmux-sidebar

기본 단축키는 다음과 같습니다

  • C + Tab : 디렉터리 트리 사이드바를 열거나 닫습니다(토글). 커서는 원래 패널에 유지됩니다.
  • C + Backspace : 사이드바를 열거나 닫으며, 커서를 사이드바로 이동합니다.
  • C + x : 현재 tmux pane 을 종료로 나갈 수 있다.

사이드바를 켜면 현재 터미널 왼쪽에 트리 형태의 디렉토리 구조를 보여줍니다.


tmux2k

상태바를 고급스럽게 표현할 수 있다.

  1. 설치

  2. tmux2k는 아이콘을 표현하기 위해 Nerd Font(너드 폰트)가 필수입니다. 일반 폰트를 사용하면 아이콘이 깨지거나 빈 네모 모양으로 표시됩니다.

Windows 터미널 (WSL/PowerShell 등) 사용 시:

WSL 설정 -> 사용중인 프로필 -> 모양 -> 글꼴에서 Nerd Font 지정

  • 설정 (Ctrl + Shift + ,) -> 사용 중인 프로필(Ubuntu 등) -> 대형 항목 또는 모양 -> 글꼴에서 설치한 Nerd Font 선택 후 저장.

우분투

1
2
3
4
5
wget https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/JetBrainsMono.zip

mkdir .fonts
cd .fonts
unzip ../JetBrainsMono.zip

폰트 캐시

1
2
3
fc-cache -fv
....
/home/user/.fonts: caching, new cache contents: 96 fonts, 0 dirs
1
set -g @plugin '2kabhishek/tmux2k'

아이콘 문제

tmux2k 사용 시 아이콘이 깨지는 현상은 주로 터미널 글꼴, UTF-8 로케일 설정, 터미널 환경 변수($TERM) 문제로 발생한다.

1
2
~$ echo $LANG
C.UTF-8

Tmux Start (202605)

Tmux 시리즈:

  1. Tmux Start (202605)
  2. Tmux Cheatsheet (202605)
  3. Tmux Plugins (202605)

이 내용은 tmux 2.x, 3.x 에서 사용 가능하다.

2026-05-29: 내용 문맥 조정, 설치 부분 삭제.
- OLD Tmux Start(20170504)
2017-07-10: tmux-continum 추가

Tmux는 terminal multiplexer로 서버에 여러 프로그램을 세션에 저장하고, 다른 작업 혹은 연결을 끊었다 다시 접속해서 세션을 열어 작업을 이어갈 수 있다.

[그림. Tmux 실행 모습 (tmux.github.io)]

설치 관련 (OLD machines)

최신 리눅스는 대부분 내장으로 설치된 듯 하다: WSL, Ubuntu 24.04/26.04 …

  • Ubuntu 14.04, Raspbian Jessie, Armbian 등에서 tmux가 1.8, 1.9 버전이 제공
  • Ubuntu 15, 16 Xenivior 버전은 Tmux 2.1
  • Old 버전 Ubuntu 14.04, Raspbian 등에서 tmux가 1.8, 1.9 버전이 제공되는데 package manager 같은 기능을 사용할 수 없다. 소스로 빌드해서 사용할 수 있다.
  • Ubuntu 14.04 desktop, orangepi plus, raspberry pi jessie 초기 버전은 빌드 필요

시작

tmux 명령으로 시작할 수 있다.

tmux 를 시작하면 하나의 세션에 하나의 윈도우가 만들어 진다.

1
2
$ tmux                   # 세션을 시작하고 참가한다.
$ tmux new -s foo # 세션 foo를 시작하고 참가한다

세션에 참가하면 하나 혹은 그 이상의 윈도우에서 Pane을 배치해 사용할 수 있다.


[그림. Tmux window layout]


세션 연결

세션은 하나 혹은 그 이상 만들고 attach 명령으로 세션에 참가할 수 있다.

1
2
3
4
$ tmux new -s foo        # 세션 foo를 시작
$ tmux ls # 세션 목록을 출력한다.
0: 1 windows (created Fri May 12 10:26:00 2017) [80x24] (attached)
foo: 1 windows (created Fri May 12 10:34:18 2017) [80x24]

터미널에서 세션에 참가하려면 attach 명령과 대상 세션을 지정해 준다. 대상 세션은 tmux ls 명령에 표시되는 세션번호 혹은 세션이름을 지정한다.

1
2
3
$ tmux attach
$ tmux attach -t 0 # 세션 0번에 참여한다
$ tmux attach -t foo # 세션 foo에 참여한다.

세션을 완전히 종료 시키려면, tmux 세션에서 명령모드 C-: 에서 kill-session 명령을 실행한다.
혹은 다른 터미널에서 세션번호 혹은 세션 이름으로 종료한다.

1
$ tmux kill-session -t 3   # 세션번호 3을 종료한다.

Control와 Meta key

Tmux 세션 시작후 Prefix key 를 통해 세션, 윈도우와 tmux 내장 명령을 실행할 수 있다.

즉, Prefix key로 Session, Window, Pane 관련 명령을 키로 조합해 사용한다.

기본 Prefix key는 Control+b key고 옵션으로 사용하는 Meta key는 Alt 키 이다.

여기서 Prefix key는 C와 조합으로 표기하고, Meta key인 AltM으로 표기한다.

윈도우 명령 control, meta 키 조합과 병행해 윈도우에서 명령모드를 사용할 수 있다.

명령모드는 C-: 키로 시작하고, 명령모드에서 명령 자동 완성 이 지원된다.


[그림. Window command mode]


Pane 다루기

윈도우는 수직/수평으로 구획을 나눌수 있다. C-“ 키로 현재 Pane 아래에 수평으로 새 Pane을 나눈다. 그리고 **C-%**키로 수직으로 새 Pane을 나눌 수 있다.


[그림. Tmux Window Pane]

  • C-q : pane 번호를 표시하고 번호를 눌러서 이동
  • C-o : pane을 순서대로 이동
  • C-방향키 : 해당 방향으로 이동
  • C-M-방향키 : 해당 방향으로 크기 조절
  • C-M-1~5 : 몇 가지 미리 설정된 레이아웃을 고를 수 있고, prefix space로 이 레이아웃을 순서대로 - 돌아가며 선택 가능
  • C-z : 특정화면만 확대하기 다시 예전 Panes상태로 돌아오기

Pane을 지우려면 C-x 키로 종료 혹은 터미널에서 exit로 터미널을 종료한다


Window 다루기

윈도우는 명령모드에서 new-window 혹은 C-c 키로 새 윈도우를 추가할 수 있다.


[그림. new Window ]

윈도우 목록은 C-w로 목록을 표시, 방향키로 윈도우 선택해 이동할 수 있다.

또한 윈도우 번호에 따라 단축키 C-0,1,2…9를 사용해 윈도우 사이의 이동 가능.

  • C-n, C-p : 다음 윈도우, 이전 윈도우로 이동
  • C-l : 직전 사용하던 윈도우로 이동
  • C-w : 윈도우 리스트를 띄우고 선택
  • C-, : 윈도우 이름 바꾸기

세션 사용중에 세션을 빠져 나오려면 C-d 로 Tmux 를 detach 할 수 있다.

detach는 명령모드 C-:에서 detach 명령을 사용할 수 있다.


복사와 스크롤

Tmux 터미널 화면 버퍼는 한 화면만 표시가 가능하다.

이전 화면 내용을 보려면 스크롤 기능을 켜야 한다. C+[ 로 스크롤 켜면, 우측상단에 페이지 표시가 나타난다.

키보드 방향키나 Page Up/Down키로 스크롤이 가능하다.


설정 사용

Tmux 의 환경 파일은 tmux 설정을 위힌 default 파일이 존재하지 않는다. 그래서 사용자가 별도의 설정파일에 작성해서 사용하면 된다.

보통 사용자 홈디렉토리에 .tmux.conf 파일에 tmux에 대한 설정을 명시할 수 있다.

설정 탑재:

  1. tmux 세션 사용중, 설정 재탑재

현재 사용중인 세션에서 C+r 로 재탑재가 가능하다.

1
C-r : 설정 파일을 새로고침합니다 
  1. tmux source 사용

변경한 설정을 적용하려면 터미널에서 다음 명령을 사용한다.

1
tmux source ~/.tmux.conf

현재 설정 추출과 백업:

tmux 기본 설정을 백업 혹은 확인하려면 tmux show 명령으로 확인이 가능하다.

1
tmux show -g

현재 tmux에 설정된 값을 백업:

1
tmux show -g | sed 's/^/set-option -g /' > ~/.tmux/tmux.current.conf

Prefix key 조합 변경

Prefix 키를 Control + a 키 조합이 편하다. 설정파일에 키 조합을 지정한다.

1
2
3
4
5
#Control+a에 'prefix' 연결
set -g prefix C-a
#send-prefix를 Control+a에 전달
bind C-a send-prefix
unbind C-b

설정을 다시 탑재하면 prefix는 C-a 로 재배치된다.

관리자들은 Capslock키를 Control 키도 선호한다.


참고

  1. OLD Tmux 시작
  2. OLD Tmux cheatsheet

Tmux Plugins (202605)

Tmux 시리즈:

  1. Tmux Start (202605)
  2. Tmux Cheatsheet (202605)
  3. Tmux Plugins (202605)

수정

2026-06-07: resurrect 무한 루프 내용 추가

Plugin manager

Tmux Pluin Manager 를 설치하고, tmux 기능을 확장할 수 있다.

tpm 설치

먼저 사용자 홈 디렉토리에 저장한다.

1
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

다음 설정을 tmux.conf 에 저장한다.

1
2
3
4
5
6
7
8
9
# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'

# other plugins ...

# Initialize TMUX plugin manager
# (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'

그리고 tmux 환경설정을 다시 탑재한다.

1
tmux source ~/.tmux.conf

plugin 설치와 키 바인딩

새 플러그인을 .tmux.confset -g @plugin 로 입력한다.

  1. 플러그인 설치를 위해서 C-I (대문자) 를 실행
  2. 플러그인 업그레이드를 위해서 C-U (대문자) 를 실행
  3. 플러그인 삭제:
    • .tmux.conf 에서 플러그인 삭제
    • C-M-u (소문자)

tpm 으로 해당 플러그인은 ~/.tmux/plugins/ 디렉토리에 패치된다.


주요 plugins

https://github.com/tmux-plugins/list

몇가지 플러그인을 설치해서 사용해 보자

tmux-sidebar

tmux 화면에 sidebar 로 tree 형식의 디렉토리 구조를 보여준다.

  1. .tmux.conf 에 플러그인을 추가한다.
1
set -g @plugin 'tmux-plugins/tmux-sidebar'
  1. tmux sourceC-r 로 설정을 재 탑재한다.

  2. C-I 로 플러그인 설치를 시작한다.

1
2
3
4
5
6
7
8
9
Already installed "tpm"
Installing "tmux-sensible"
"tmux-sensible" download success
Installing "tmux-sidebar"
"tmux-sidebar" download success

TMUX environment reloaded.

Done, press ESCAPE to continue.
  1. side-bar 키 바인딩
  • prefix + Tab - toggle sidebar with a directory tree
  • prefix + Backspace - toggle sidebar and move cursor to it (focus it)

plugin 삭제

  1. .tmux.conf 에서 해당 플러그인을 삭제한다.
  2. C-M-u 로 플러그인을 삭제한다.

여기서는 tmux-cpu 를 삭제하고 있다.

1
2
3
4
5
6
Removing "tmux-cpu"
"tmux-cpu" clean success

TMUX environment reloaded.

Done, press ESCAPE to continue.

Tmux-Resurrection

_tmux-resurrect_는 tmux 세션을 백업/복구 할 수 있는 플러그인이다. tmux.conf에 다음을 추가

1
set -g @plugin 'tmux-plugins/tmux-resurrect'

플러그인 설치를 위해서 C-I 를 실행하면 설치를 시작한다.

Resurrection 플러그인으로 백업/복구하는 키는 다음 같이 지정되어 있다:

  • C-s : save
  • C-r : restore

Tmux-continuum

tmux-continuum은 tmux-resurrect 플러그인과 연동하여 tmux 세션 상태를 주기적으로 자동 저장하고, 시스템 부팅 시 복원해주는 플러그인입니다.

tmux-continuum 의 주요 기능은:

  • tmux 환경을 15분 마다 자동 저장
  • 컴퓨터/서버 시작시 tmux 자동 시작 가능
  • tmux 시작시 자동 복구 가능
  • tmux 1.9 이상, bash, tmux-resurrect plugin

설치

  1. 설치는 .tmux.conf 파일에 mux-resurrecttmux-continuum 플러그인을 추가:
1
2
3
4
5
6
7
8
9
10
11
12
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'

# (continuum) tmux 시작 시 마지막 세션 자동 복원
set -g @continuum-restore 'on'

# (continuum) 자동 저장 간격 변경 (기본값: 15분)
set -g @continuum-save-interval '15'

# (continuum) continuum 상태표시
set -g status-right 'Continuum status: #{continuum_status}'
  1. tmux sourceC-r 로 설정을 재 탑재한다.

  2. C-I 로 플러그인 설치를 시작한다.

1
2
3
4
5
6
7
8
9
10
11
Already installed "tpm"
Already installed "tmux-sensible"
Already installed "tmux-sidebar"
Installing "tmux-resurrect"
"tmux-resurrect" download success
Installing "tmux-continuum"
"tmux-continuum" download success

TMUX environment reloaded.

Done, press ESCAPE to continue

이제부터 15분 마다 자동 저장하고 서버를 재시작한 후에 tmux를 다시 시작하면 저장한 환경을 자동으로 복구해 준다.

  1. 키 바인딩
  • 세션 수동 저장: Ctrl + b 누른 후 Ctrl + s (Resurrect 기능)
  • 세션 수동 복원: Ctrl + b 누른 후 Ctrl + r (Resurrect 기능)

tmux 세션을 모두 나와서 tmux 서버를 모두 kill-session 같은 명령으로 종료시킨후 tmux를 다시 시작하면 .tmux/resurrect 에 저장된 마지막 세션이 복구되는 것을 확인할 수 있다.


tmux 무한 exited 문제

tmux-resurrectcontinuum은 가끔 문제를 일으킨다.

재시작 등의 이유로 이전 저장한 세션을 탑재중 무한 exited 로 종료되는 상황이 그것이다.

예를 들어 tmux2k 설정중 시스템 locale 을 다시 설정하게 된 후 tmux 가 exited 되는 문제가 발생했다.

세션을 모두 빠져나간다

1
$ tmux kill-server # 다른 터미널에서 실행

방법1:

.tmux.conf 에서 set -g @continuum-restore ‘on’을 #으로 주석 처리

tmux 실행 후 정상 작동 확인후 안되면 방법2로 모든 세션을 초기화 한다.

방법2. continuum 세션 삭제

continuum 의 세션은 백업 파일이 꼬여서 그런것 같다.

tmux-resurrectcontinuum은 세션 정보를 특정 디렉토리에 텍스트 파일로 저장하고 있다.

기본 저장 위치는 아래와 같다.

1
2
3
4
5
$ ls -l .local/share/tmux/resurrect/
total 4
lrwxrwxrwx 1 user user 34 5월 29 21:47 last -> tmux_resurrect_20260529T214713.txt
-rw-r--r-- 1 user user 239 5월 29 21:36 tmux_resurrect_20260529T213616.txt
-rw-rw-r-- 1 user user 0 5월 29 21:47 tmux_resurrect_20260529T214713.txt

기존에 저장된 백업 데이터를 삭제(초기화)한다.

1
rm -rf ~/.local/share/tmux/resurrect/*.txt

해당 세션 정보 백업 파일을 삭제후 tmux 를 시작하면 깨끗하게 다시 시작된다.


CLI 로 플러그인 관리

https://github.com/tmux-plugins/tpm/blob/master/docs/managing_plugins_via_cmd_line.md

Tmux cheatsheet (202605)

Tmux 시리즈:

  1. Tmux Start (202605)
  2. Tmux Cheatsheet (202605)
  3. Tmux Plugins (202605)

  • 2026-05 : 수정
  • 2017-07-14: 윈도우에서 session 관리
  • 2017-07-10: tmux copy & paste

세션 사용

tmux 세션을 만들고, 세션에서 window를 구성하고, window 안에 pane에 대해서 요약

새로운 세션 시작하기

1
2
$ tmux                        #새로운 새션
$ tmux new -s session_name #session_name으로 새로운 세션

세션을 dettach하면 세션은 저장된다. 사용하지 않으면 kill로 종료한다.

세션 이용하기

1
2
3
$ tmux ls
$ tmux list-session
$ tmux list-windows # Window 목록

열린 세션에 붙기.

  • 세션 번호중 낮은 번호에 우선해서 접속한다.
1
2
3
$ tmux attach
$ tmux at
$ tmux a

특정 세션에 접속하기

  • 세션 번호 혹은 이름으로 접속한다.
1
$ tmux a -t session_name

세션 마감하기

1
$ tmux kill-session session_name


Tmux pane

Tmux로 접속한 session은 처음 한개의 Window를 갖는다. window 안에서 session, window, pane을 관리한다. 각 윈도우는 한 개 이상의 Pane 구획으로 나누어 사용할 수 있다.

Tmux window를 여러 분할면 pane으로 나눠 사용한다.

1
2
3
4
5
6
7
8
9
10
11
C-%          # 수직으로 나누기
C-" # 수평으로 나누기
C-z # 현재 pane 확대 및 돌아오기
C-{ # 현재 pane을 이전 pane 위치로 이동
C-} # 현재 pane을 다음 pane 위치로 이동
C-Arrow # 앞,뒤 pane을 방향키로 이동
C-M+Arrow # pane 크기를 방향키에 따라 변경
C-spacebar # pane 방향 전환 (수직<->수평)
C-! # 현재 pane을 새 window로 분리
C-x # 현재 pane을 종료
C-[ # pane에서 스크롤 기능을 활성화

Tmux copy & paste

tmux 는 자체 버퍼에 터미널에서 선택한 영역의 텍스트를 복사해서 사용할 수 있다.

1
2
3
4
C-[         # copy mode
Ctrl+space # 복사할 영역을 선택한다. 터미널에 영역이 선택되어 보인다.
Ctrl+w # 선택한 영역을 복사한다.
C-] # 붙여 넣는다.

Tmux Window

현재 세션 이용

1
2
C-s            #Session 목록
C-$ #Session 이름 변경

세션에서 여러 윈도우를 추가 해서 사용할 수 있다.

1
C-c          #새로운 윈도우 생성

여러 윈도우는 윈도우 순서에 따라 현재 윈도우 화면을 교환 할 수 있다.

1
2
3
4
5
6
7
C-w          #윈도우 목록
C-1 ... #지정 윈도우 번호로 전환: 0,1,...
C-p #이전 윈도우로 이동
C-n #다음 윈도우로 이동
C-l #가장 마지막 윈도우로 이동
C-, #현재 윈도우 이름 변경
C-& #현재 윈도우 제거

현재 세션에서 나온다. 세션은 백그라운드에서 실행된다.

1
2
C-d          #현재 세션을 빠져 나온다 (detach)
C-D #빠져나올 세션을 선택할 수 있다.
  • detach 는 외부 터미널에서 tmux detach 를 실행하면 현재 tmux 세션이 분리된다.

Session transition

Tmux window 상태에서 여러 세션 사이의 전환 단축키;

1
2
3
4
5
C-$          # 현재 세션 이름 바꾸기
C-( # 이전 세션으로 전환
C-) # 다음 세션으로 전환
C-L # 사용한 세션중 마지막 세션으로 전환
C-s # 사용 가능한 세션 목록

단, 시스템 버퍼는 별도의 플러그인을 사용한다.


재미있는 설정

마우스 모드 활성화

설정에 mouse mode 활성화를 .tmux.conf 설정으로 지정.

1
set -g mouse on

설정을 탑재하면 1. 마우스 드래그로 선택한 버퍼 복사 2. Shift 마우스 드래그로 일반 Copy 수행.


버퍼 크기

1
2
# scrollback buffer size increase
set -g history-limit 100000

Pane 이동

M 와 방향키로 바인딩해서 prefix 없이 사용.

1
2
3
4
5
# Use Alt-arrow keys without prefix key to switch panes
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D

상태바 컬러

1
2
3
# bar color
set -g status-bg black
set -g status-fg white

Linux - ssh 키 공유

SSH 키 공유(Key-based Authentication) 는 Client과 서버(Server) 로그온 및 ssh 사용시 비밀번호를 매번 입력하는 번거로움을 없애줄 뿐만 아니라, 보안 측면에서도 훨씬 강력한 방식이다.

ssh 키공유

SSH 키-공유의 작동 원리

  • 이 방식은 비대칭 암호화를 이용합니다.
  • 비공개 키(Private Key): 노트북에 보관하며, 절대 외부로 유출되면 안 됩니다 (열쇠 역할).
  • 공개 키(Public Key): 서버에 등록하며, 누구나 봐도 상관없습니다 (자물쇠 역할).

ssh를 사용하는 클라이언트에서 ssh-keygen 으로 비밀키공개키를 생성하고, 접속하는 서버 계정 밑에 클라이언트 공개키를 저장하면 ssh 접속시 비밀번호 응답 없이 처리되어 로그인 할 수 있다.

ssh-key 로 생성시 암호화는 RSA 와 ED2619 를 사용한다.

RSA 와 ED2619 에 대해서는 아래 별도 섹션 참고.


1. ssh 클라이언트 비밀키 생성

클라이언트에서 개인 비밀키를 생성한다. ssh-keygen 명령은 기본적으로 비밀키와 공개키 파일을 사용자 홈디렉토리 ~/.ssh 폴더에, 기본 파일이름 id_rsa.pub, id_rsa.prb 파일로 저장한다.

1
(CLIENT)$ ssh-keygen -t ed2619 -C "USER@localhost"
  • ed25519 방식은 최신 알고리즘으로 보안성이 높고 속도가 빠릅니다.
  • 엔터를 몇 번 치면 ~/.ssh/id_ed25519(비공개 키)와 ~/.ssh/id_ed25519.pub(공개 키)가 생성됩니다.

2. ssh 서버 비밀키 생성

서버에도 클라이언트와 동일하게 ssh-keygen 명령으로 비밀키와 공개키를 생성한다.

1
(SERVER)$ ssh-keygen -t ed2619 -b 4096 -C "USER@server"

3. 서버로 공개 키 복사

가장 쉬운 방법은 ssh-copy-id 도구를 사용하는 것입니다.

1
2
ssh-copy-id 사용자명@서버IP
# 예: ssh-copy-id daddy@192.168.0.10

이 명령어를 실행하면 서버의 비밀번호를 마지막으로 한 번 물어본 뒤, 노트북의 공개 키를 서버의 ~/.ssh/authorized_keys 파일에 자동으로 등록합니다.

4. 접속 테스트

이제 비밀번호 없이 바로 접속되는지 확인합니다.

1
ssh 사용자명@서버IP

보안 강화 (선택 사항)

키 공유가 완료되었다면, 서버의 SSH 설정 파일(/etc/ssh/sshd_config)에서 비밀번호 로그인을 아예 금지하여 보안을 극대화할 수 있습니다.

1
2
3
4
5
6
7
8
# 서버에서 실행
sudo nano /etc/ssh/sshd_config

# 아래 항목을 찾아서 no로 수정
PasswordAuthentication no

# 설정 적용
sudo systemctl restart ssh

참고: scp 이용한 키 공유

서버에 공개키 배포

클라이언트에 생성한 공개키 id_rsa.pub 파일을 업로드해서 ./ssh/authorized_keys 파일에 추가해야 한다. 보통 scp 명령으로 복사해서 authorized_keys 파일에 더해주면 된다.

일반적으로 scp 명령으로 복사하고, 서버에 ssh 접속해서 업로드한 공개키 파일을 authorized_keys 파일에 더해준다.

1. 클라이언트에서 복사하기:

1
scp ~/.ssh/id_rsa.pub USER_ID@HOST_NAME:~/client.pub

ssh로 서버에 로그인한다.

2.서버 authorized_keys 붙여넣기:

1
2
ssh userid@SERVER
(SERVER) $ cat client.pub >> .ssh/authorized_keys; rm client.pub

위 2 과정을 아래 명령 한 줄로 복사->붙여넣기를 동시에 할 수 있다.

클라이언트:

1
cat ~/.ssh/id_rsa.pub | ssh <USERNAME>@<IP-ADDRESS> 'cat >> .ssh/authorized_keys'

이제 해당 서버로 로그인해 본다.


참고: RSA 와 ED25519 (feat. Gemini)

ssh-keygen 명령으로 SSH 키를 생성할 때 rsaED25519는 서로 다른 암호화 알고리즘을 사용하며, 각각 장단점이 있습니다.

1. RSA (Rivest-Shamir-Adleman)

  • 역사 및 범용성: RSA는 매우 오래되고 널리 사용되는 공개 키 암호화 알고리즘입니다. 오랫동안 SSH 키의 표준으로 사용되어 왔으며, 대부분의 시스템과 호환됩니다.
  • 키 크기: RSA 키는 가변적인 길이를 가집니다. 일반적으로 보안을 위해 2048비트 또는 4096비트를 권장합니다. 키 길이가 길어질수록 보안은 강해지지만, 연산 속도는 느려집니다.
  • 보안: 충분히 긴 키 길이 (예: 2048비트 이상)를 사용하면 현재로서는 안전하다고 여겨지지만, 양자 컴퓨터의 발전 등 미래의 위협에 대한 우려가 있습니다.
  • 성능: 키 길이가 길어질수록 키 생성, 서명 및 검증 작업이 느려질 수 있습니다.

2. ED25519 (Edwards-curve Digital Signature Algorithm)

  • 기반 기술: ED25519는 타원 곡선 암호화(ECC)의 일종인 Edwards-curve Digital Signature Algorithm을 기반으로 합니다. OpenSSH 6.5에서 도입되었습니다.
  • 보안: ED25519는 더 작은 키 크기로도 RSA와 동등하거나 더 높은 수준의 보안을 제공합니다. 예를 들어, ED25519의 256비트 키는 RSA 3000비트 키와 비슷한 보안 강도를 가집니다. 특정 암호화 공격(예: PRNG(Pseudo-Random Number Generator) 실패)에 더 강력하다고 알려져 있습니다.
  • 성능: 키 생성, 서명 및 검증 작업이 RSA보다 훨씬 빠르고 효율적입니다. 이는 로그인 시간 단축 등 전반적인 사용자 경험 개선으로 이어질 수 있습니다.
  • 키 크기: ED25519 키는 고정된 256비트 크기를 가지므로 RSA 키보다 훨씬 짧습니다. 이 때문에 키를 관리하고 공유하는 데 더 효율적입니다.
  • 호환성: 비교적 최신 알고리즘이므로, 매우 오래된 시스템이나 특정 환경에서는 지원되지 않을 수도 있습니다. 하지만 최신 시스템에서는 널리 지원됩니다.

주요 차이점 요약:

특징 RSA ED25519
기반 정수 분해 문제 타원 곡선 암호화 (ECC)
키 크기 가변 (2048, 4096비트 등 권장) 고정 (256비트)
보안 충분히 길면 안전하지만, 미래 위협 우려 작은 키로도 높은 보안성, 특정 공격에 강함
성능 키 길이에 따라 느려질 수 있음 빠르고 효율적
호환성 매우 광범위 최신 시스템에서 널리 지원, 일부 구형 시스템 제한

어떤 것을 사용해야 할까요?

  • 특별한 이유가 없다면 ED25519를 권장합니다. 더 나은 보안성과 성능을 제공하며, 대부분의 최신 환경에서 문제없이 사용할 수 있습니다.
  • 레거시 시스템과의 호환성이 중요하거나, ED25519를 지원하지 않는 환경이라면 RSA를 사용해야 합니다. 이 경우 최소 2048비트, 가능하다면 4096비트 키를 사용하는 것이 좋습니다. Windows 또는 VMware 이미지와 같은 특정 환경에서는 ED25519가 지원되지 않을 수 있습니다.

결론적으로, 현재 대부분의 SSH 키 생성에는 ED25519가 권장되는 최신, 안전, 고성능 옵션입니다.

Docker installation (Ubuntu)

https://docs.docker.com/engine/install/ubuntu/

기존 패키지를 제거한다.

1
$ for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

Install using the apt repository

1
2
3
4
5
6
# Add Docker's official GPG key
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

apt repository 추가

1
2
3
4
5
6
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

최신 버전 설치

1
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

To verify that Docker is running, use:

1
$ sudo systemctl status docker

Some systems may have this behavior disabled and will require a manual start:

1
$ sudo systemctl start docker

Verify that the installation is successful by running the hello-world image:

1
$ sudo docker run hello-world

https://docs.docker.com/engine/install/ubuntu/

Kalli linux 01

Kali linux 를 다운로드 한다.

Kalia linux 다운로드에 VB 용 게스트 이미지가 제공되고 있다. 이것을 다운받아 사용한다

VB 메인 화면에서 “+” 추가로 다운 받은 게스트 이미지를 추가할 수 있다.

인터넷 + 게스트와 통신

진행을 위해서 인터넷 사용과 Kali linux 게스트 머신 사이에 네트워크 연결이 필요하다.

여기서 네트워크 어댑터를 2가지 방법으로 설정해서 인터넷 + 통신을 설정한다.

NAT 와 Host-only

  1. NAT 설정

게스트에서 외부 인터넷을 호스트 머신의 네트워크를 이용해 변환해 사용한다.

호스트 머신에서 게스트 머신으로 통신이 안된다.

오직 인터넷 용이다.

  1. Host only 설정

호스트에서 게스트로 통신이 가능하다.

혹은 다른 게스트에서 게스트로 통신이 가능하다.

NAT 와 Host-only 설정

설정 -> 네트워크에서 어댑터를 추가한다

호스트에서 interface 를 확인해 보면 다음 같이 추가된 것을 볼 수 있다

1
2
3
4
5
6
7
Ethernet adapter 이더넷 3:

Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::af41:7d81:b36a:5a23%52
IPv4 Address. . . . . . . . . . . : 192.168.56.1
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . :

ip addr 명령으로 추가하 이더넷 어댑터를 확인하면 NAT 용 어댑터는 ip가 할당되어 보인다.

추가한 2번째 어댑터는 IP 가 없어서 강재로 dhcp 요청을 해야 한다.

1
sudo dhclient eth1

혹은 interfaces 파일을 직접 수정할 수 있다.

/etc/network/interfaces

1
2
3
4
5
auth eht0
iface eht0 inet dhcp

auth eht1
iface eht1 inet dhcp

그리고 networking 서비스를 재시작한다.

sudo systemctl restart networking

혹은 interfaces 파일에 수동 ip를 줄 수 있다.

auto enp0s8 allow-hotplug enp0s8
iface enp0s8 inet static
address 192.168.56.11
netmask 255.255.255.0

설정 -> 네트워크 설정 에서 어댑터를 선택하고 IPv4 에서 manually 로 수동 ip를 준다.

보통 윈도우 호스트 머신은 192.168.56.1 네트워크를 사용한다.

설정후 호스트 머신에서 가상머신의 ip 주소를 ping 해본다

1
2
3
4
5
6
. . . . . :
PS C:\Users\daddy\Downloads> ping 192.168.56.10

Pinging 192.168.56.10 with 32 bytes of data:
Reply from 192.168.56.10: bytes=32 time<1ms TTL=64
Reply from 192.168.56.10: bytes=32 time<1ms TTL=64

칼리 리눅스의 보안 프로그램

칼리 리눅스는 기본적으로 보안 패키지를 포함하고 있다. 메뉴에서 확인 가능하다.

첫번째 메뉴 - 정보 수집 관련 프로그램들

두번째 메뉴 - 취약점 분석과 관련된 프로그램들

세번째 메뉴 - 웹과 관련된 프로그램들

이 과정은 버프 스위트(burpsuite) 를 주로 사용한다.

샘플 코드 다운로드

저자가 작성한 POC(Proof of Concept) 코드

POC 코드란 어떤 공격이 가능하다는 것을 보여주는 간단한 예제 코드이다.

칼리리눅스에서 github.com/bjpublic/whitehacker 에서 다운로드한다.

압축을 해제하

웹 모의해킹 실습용 가상머신 bee-box

모의 해킹을 위한 가상머신

github.com/bjpublic/whitehacker 에서 ova 를 다운로드한다.

요소 설명
DWA 웹 모의해킹이 가능하도록 보안 취약점을 만들어 둔 웹 애플리케이션, 소스코드 레벨에서 취약한 코드와 공격 대응을 위한 코드를 쉽게 확인할 수 있어서 시큐어 코딩을 학습하기 좋다
bWAP 비박스에서 기본으로 제공하는 웹 애플리케이션이다. DVWA 처럼 웹 모의해킹을 실습할 수 있다. DWA 보다 다양한 공격을 할 수 있다.
JBoss 4.2.3GA 잡바 웹 애플리케이셔 개발, 4.2.3 Ga 버전은 자바 역직렬화 취약점이 있어서 실습할 수 있다.

실습용 가상머신은 메로리가 1024MB 로 되어 있다.

오리지널

bee-box는 웹 취약점을 공격할 수 있는 오픈소스 웹 애플리케이션인 bWApp가 설치되어 있으며 웹 취약점 공격을 공부할 수 있도록 만들어진 가상환경입니다.

보통 가상머신 설치와 같이 두가지 방법으로 설치할 수 있습니다-!!

① bWAPP을 해당 호스트에 설치하는 방법

② 비박스를 가상환경에 설치하여 미리 설치된 bWAPP를 사용하는 방법

참고: https://power-girl0-0.tistory.com/13

저는두번째 방법을 바탕으로 다운로드를 해보았습니다-!!

다같이 설치해볼까용~~??

① 비박스 공식 홈페이지에 접속합니다.

http://sourceforge.net/projects/bwapp/files/bee-box/

아이디 : bee / 비밀번호 : bug

unison 사용 (feat. gemini)

Unison은 로컬 디렉토리와 다른 로컬 디렉토리, 또는 로컬 디렉토리와 원격 디렉토리 간에 파일을 양방향으로 동기화하는 데 사용되는 강력한 도구이다.

  • rsync가 단방향 동기화에 강점이 있다면,
  • Unison은 양쪽의 변경 사항을 모두 감지하여
  • 충돌을 해결하고 일관성을 유지하는 데 특화되어 있다.

Unison을 사용하는 방법은 크게 CLI(명령줄 인터페이스) 방식과 GUI(그래픽 사용자 인터페이스) 방식이 있다.


Unison 설치

대부분의 리눅스 배포판에서 패키지 관리자를 통해 Unison을 설치할 수 있다.

  • Ubuntu/Debian:

    1
    2
    sudo apt update
    sudo apt install unison unison-gtk
    • unison-gtk는 GUI 버전
  • Fedora/CentOS/RHEL:

    1
    sudo dnf install unison unison-gui
    • unison-gui는 GUI 버전
  • macOS (Homebrew):

    1
    brew install unison
    • macos에서 GUI 버전은 따로 설치 할 수 있다 (예: brew install --cask unison).
  • Windows:

    • Unison 공식 웹사이트에서 설치 파일을 다운로드하여 설치할 수 있다. 일반적으로 unison.exeunison-gtk.exe 파일이 제공된다.

Unison 사용 시 고려사항 및 팁:

중요: 동기화하려는 양쪽 시스템(로컬 및 원격)에 동일한 버전의 Unison이 설치되어 있어야 한다. 버전이 다르면 오류가 발생할 수 있다.

  • 동일한 버전: 동기화하려는 양쪽 시스템의 Unison 버전이 반드시 같아야 한다.
  • SSH 키 인증: 원격 동기화 시 매번 비밀번호를 입력하는 번거로움을 줄이려면 SSH 키 기반 인증을 설정하는 것이 좋다.
  • 충돌 관리: Unison은 파일 내용이 양쪽에서 동시에 변경될 때 “충돌(conflict)”을 감지되고 이 경우 사용자가 수동으로 어떤 버전을 유지할지 결정해야 한다. --prefer 옵션을 사용하면 충돌 시 특정 방향을 자동으로 선호할 수 있지만, 데이터 손실 위험이 있으므로 주의해야 한다.
  • 백업: 중요한 데이터를 동기화하기 전에 항상 백업을 해두는 것이 좋다.
  • ~/.unison 디렉토리: Unison은 이 디렉토리에 동기화 상태, 프로필 파일, 로그 등을 저장한다. 문제가 발생하면 이 디렉토리의 내용을 확인하거나 삭제하여 초기화할 수 있다.
  • 성능: 대량의 파일을 처음 동기화할 때는 시간이 오래 걸릴 수 있지만, 이후에는 변경된 부분만 동기화하므로 빠르게 처리된다.

CLI (명령줄 인터페이스)로 Unison 사용하기

CLI 방식은 스크립트 작성이나 자동화에 유용합니다.

기본 사용법:

명령 형식:

unison 명령으로 특정 폴더를 지정해 동기화 할 수 있다.

1
unison [옵션] [root1] [root2]

또는 Unison은 “프로필”이라는 개념을 사용하여 동기화 설정을 저장하고 관리한다. 프로필을 사용하면 복잡한 옵션을 매번 입력할 필요 없이 간단하게 동기화를 실행할 수 있다.

1
unison [프로필_이름] [옵션]

예시 1: 로컬 디렉토리 간 동기화

두 개의 로컬 디렉토리 ~/dir1~/dir2를 동기화한다고 가정해 보자.

  1. 첫 번째 동기화 (프로필 생성):

    1
    unison ~/dir1 ~/dir2

    이 명령을 처음 실행하면 Unison은 두 디렉토리를 비교하고 어떤 파일이 어디에 있는지, 어떤 변경 사항이 있는지 알려줍니다. 그리고 “Save this configuration as default for roots?”와 같은 질문을 할 것입니다. y를 입력하여 프로필을 저장하는 것이 좋습니다. 기본 프로필 이름은 default가 됩니다.

  2. 질문 및 응답:

    • Unison은 각 파일에 대해 어떤 작업을 수행할지 묻습니다 (->는 왼쪽에서 오른쪽으로, <-는 오른쪽에서 왼쪽으로, ==는 동일함, ?는 충돌).
    • 대부분의 경우 y를 입력하여 제안된 작업을 수락하거나, n을 입력하여 건너뛸 수 있습니다.
    • 충돌이 발생하면 Unison은 어떤 버전을 유지할지 선택하라고 묻습니다.
  3. 이후 동기화 (프로필 사용):

    1
    unison default

    또는 단순히:

    1
    unison

    (default 프로필이 있다면 자동으로 로드됩니다.)
    Unison은 이전 동기화 이후의 변경 사항만 감지하여 빠르고 효율적으로 동기화합니다.

예시 2: 로컬과 원격 디렉토리 간 동기화 (SSH 사용)

로컬 ~/local_dir과 원격 서버 user@remote_host:/remote_dir를 동기화한다고 가정해 봅시다.

  1. 첫 번째 동기화 (프로필 생성):

    1
    unison ~/local_dir ssh://user@remote_host//remote_dir
    • ssh://user@remote_host/: 원격 호스트에 SSH로 연결하겠다는 의미입니다.
    • //remote_dir: 원격 경로입니다. /가 두 개입니다. 이는 원격 루트 디렉토리부터의 절대 경로임을 나타냅니다.
  2. SSH 비밀번호 입력: SSH 연결을 위해 비밀번호를 입력하라는 메시지가 나타날 수 있습니다. SSH 키 기반 인증을 설정해두면 편리합니다.

  3. 질문 및 응답: 로컬 동기화와 마찬가지로 Unison이 각 파일에 대해 묻습니다.

  4. 이후 동기화:
    default 프로필로 저장했다면:

    1
    unison

중요한 옵션:

  • -batch 또는 -auto: 충돌이 없으면 사용자 입력 없이 자동으로 동기화를 진행합니다. 스크립트에서 유용합니다.
  • -auto -force [root]: 특정 루트(예: root1)의 파일을 다른 루트에 강제로 덮어씌웁니다. 충돌 시 유용할 수 있지만, 주의해서 사용해야 합니다.
  • -ignore [패턴]: 특정 파일이나 디렉토리를 동기화에서 제외합니다. (예: -ignore "Thumbs.db" 또는 -ignore "*/.git/*")
  • -prefer [root]: 충돌이 발생했을 때 특정 루트의 버전을 선호합니다. (예: -prefer newer는 더 최근에 수정된 파일을 선호).
  • -silent: 터미널 출력을 최소화합니다.
  • -perms 0: 파일 권한 동기화를 비활성화합니다. (Windows와 Linux/macOS 간 동기화 시 유용)
  • -times: 파일 수정 시간을 동기화합니다. (기본적으로 활성화되어 있지만, 명시적으로 지정할 수 있습니다.)

프로필 파일 직접 생성 및 편집

Unison은 프로필을 $HOME/.unison 디렉토리에 .prf 확장자를 가진 파일로 저장합니다. 예를 들어, my_sync.prf라는 프로필을 만들고 싶다면:

1
2
3
4
5
6
7
8
9
10
# ~/.unison/my_sync.prf 파일 내용
root = /home/사용자이름/dir1
root = ssh://user@remote_host//remote_dir

# 예시 옵션
ignore = Path Thumbs.db
ignore = Name *~
ignore = Name *.bak
prefer = newer
batch = true

이렇게 프로필 파일을 만든 후에는 다음과 같이 동기화를 실행할 수 있습니다:

1
unison my_sync

사용

Unison은 두 디렉토리의 내용을 비교하고, 어떤 파일이 어느 쪽에만 있거나 변경되었는지 보여줍니다.

1
unison ~/my_wsl_project /mnt/e/WindowsProjects/MyProject

실해을 하면 “Save this configuration as default for roots?” 와 같은 질문이 나오면 y를 입력하여 프로필을 저장하는 것이 좋습니다. 이렇게 하면 다음부터는 단순히 unison 또는 unison default로 실행할 수 있습니다.

  • 각 파일에 대해 -> (왼쪽에서 오른쪽으로 복사), <- (오른쪽에서 왼쪽으로 복사), ? (충돌) 등의 제안이 표시됩니다. y를 눌러 수락하거나, n을 눌러 건너뛸 수 있습니다.

ssh 사용

Unison 프로필에서 SSH 키 파일을 사용하는 방법은 SSH 클라이언트 설정과 Unison 프로필 설정을 함께 이용하는 것입니다.

Unison이 SSH 키 파일을 자동으로 인식하고 사용하여 원격

로컬에서 원격 서버에 ssh-key 를 생성해 공개키를 ssh 키 공유를 위해 복사한다

1
ssh-keygen -t rsa -b 4096

원격 서버에 로컬 공개키를 복사한다.

1
ssh-copy-id user@remote_host

~/.ssh/config 에 호스트별 키 파일을 지정한다.

~/.ssh/config 파일을 열거나 새로 생성하고 다음 내용을 추가합니다:

1
2
3
4
5
6
Host myremoteserver             # 이 부분은 원하는 별칭 (Alias)
HostName 192.168.1.100 # 원격 서버의 실제 IP 주소 또는 도메인
User remoteuser # 원격 서버에 로그인할 사용자 이름
Port 22 # SSH 포트 (기본은 22, 변경했다면 여기에 입력)
IdentityFile ~/.ssh/id_rsa # 사용할 개인 키 파일의 경로
IdentitiesOnly yes # 명시된 IdentityFile만 사용하도록 강제

unison 프로파일에 ssh host 를 사용해서 설정한다.

1
2
3
4
5
6
7
8
9
10
11
12
# 로컬 디렉토리
root = /home/youruser/local_project

# 원격 WSL2 디렉토리 (myremoteserver는 ~/.ssh/config에 설정한 별칭)
root = ssh://myremoteserver//mnt/e/remote_data

# 선택적 Unison 옵션
batch = true
prefer = newer
ignore = Path .git
ignore = Name Thumbs.db
perms = 0 # Windows 드라이브 동기화 시 권한 문제 방지를 위해 유용

journalctl 명령

journalctl 이란?

  • systemd의 서비스 로그를 확인할 수 있다.
  • systemd-journald.service에 의해서 systemd의 정보들을 분석한다.

journalctl 옵션

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-a : 표시할 수 없는 문자가 있거나 매우 긴 경우에도 모든 Log 내용을 출력
-b : 마지막 부팅 후의 Log만 출력
-r : 최신항목이 먼저 표시되도록 역순으로 출력
-c : 커서가 지정한 저널의 위치부터 Log 표시를 시작
-f : 가장 최근 Log만 표시하고 새롭게 추가되는 Log는 계속 출력
-k : 커널 메시지만 출력 (dmesg랑 같음)
-q : 일반 사용자로 실행될 때 접근할 수 없는 시스템 저널에 관한 경고메시지를 표시하지 않음
-u : unit으로 systemctl list-units에서 출력되는 첫번째 항목
-p : 메시지의 우선순위로 log level을 의미
emerg=0, alert=1, crit=2, err=3, warning=4, notice=5, info=6, debug=7
-o : Log 출력 형식을 설정
short : 기본값으로 syslog파일의 형식과 동일하다. 한 행에 하나의 Log만 출력
short-iso : short와 비슷하지만 ISO 8601의 시간 형식으로 출력
short-precise : short와 비슷하지만 마이크로 초 단위로 시간 출력
short-monotonic : short와 비슷하지만 단조로운 시간 형식으로 출력
verbose : 전체 Log를 모두 자세하게 출력
export : Log내용을 내보낸다. (백업 및 전송에 적합한 바이너리 스트림으로 직렬화)
json : 한줄에 하나씩 JSON 데이터 구조로 형식화
json-pretty : JSON 데이터 구조로 형식화 하지만 여러줄로 형식을 지정하여 사람이 읽을 수 있게 한다.
json-see : JSON 데이터 구조로 형식화 하지만 Server-Sent Events에 적합한 형식으로 한다.
cat : 매우 간결한 출력을 생성하며 메타 데이터가 없고 Log만 표시하며 시간은 표시하지 않음
-l : 출력되는 Log의 필드를 줄일때 사용, 기본값은 전체 필드를 표시하여 사용자가 해당 필드를 붙이거나 자를 수 있도록 한다.
_UID= 33 : 33번 UID를 가진 프로세스에 대한 Log를 출력
--disk-usage : 저널 파일의 디스크 사용량을 표시 (압춘된 모든 더널 파일과 사용중인 저널 파일의 합계를 표시)

사용법

마지막 부팅 후 로그 보기

1
2
# 마지막 부팅 후 로그 보기
$ journalctl -b

오늘 날짜 로그 보기

1
# journalctl --since=today

특정 기간별 로그 보기

1
2
3
4
5
journalctl --since "2017-05-25 00:00:00" --until "2017-05-30 10:30:00"

journalctl --since "1 hour ago"

journalctl --since "2 days ago"

특정 서비스 로그 보기

-u 로 유니트 이름을 지정한다.

1
$ journalctl -u sshd

/etc/systemd/system/my_server.service 에 등록한 유니트

1
journalctl -u my_server.service

mysql 서비스의 로그 보기

1
sudo journalctl -u mysql

~$ journalctl -p err -u mysql

특정 이벤트 속성 조회

1
# journalctl -p crit

Error 로그 자세히 보기

1
journalctl -p err -o verbose
  1. 특정 서비스데몬 및 속성과 날짜 로그 보기

journalctl -u libvirtd –since=yesterday -p err

  1. 특정 이벤트 조회

journalctl /sbin/crond

  1. 밑에서부터 로그 보기

journalctl -f

journalctl -r -b

  1. UID 로 검색 (id)
    journalctl _UID=108

journalctl이 느릴때(btrfs)

  1. Log의 크기를 확인

journalctl –disk-usage

  1. 로그를 저장하는 파일 데이터베이스에 단편화를 확인

filefrag /var/log/journal//

  1. 단편화를 제거
1
# btrfs fi defrag -v -f -clzo /var/log/journal/*/* 

설정파일

/etc/systemd/journald.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitInterval=30s
#RateLimitBurst=1000
#SystemMaxUse= -> journal log 파일의 최대 Size를 지정
#SystemKeepFree=
#SystemMaxFileSize=
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#MaxRetentionSec=
#MaxFileSec=1month -> journal log 파일의 최대보관일수를 지정
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg

– 참고 —

https://lascrea.tistory.com/70
https://www.loggly.com/ultimate-guide/using-journalctl/

[Linux] ls, ps, find, grep, awk 명령

파일, 디렉토리의 크기

ls 옵션

  • -h, --human-readable : with -l and -s, print sizes like 1K 234M 2G etc.
1
ls -lh /home

파일, 디렉토리 전체 날짜

1
2
3
4
5
6
7
8
9
 ls --time-style=long-iso -al             
total 156
dr-xr-x--- 12 root root 4096 2022-05-06 13:22 .
drwxr-xr-x 18 root root 4096 2022-04-01 14:02 ..
-rw------- 1 root root 1201 2021-11-19 22:38 anaconda-ks.cfg
drwx------ 3 root root 4096 2022-03-31 12:01 .ansible
-rw-r--r-- 1 root root 804 2022-02-03 10:50 authorized_keys
-rw------- 1 root root 28346 2022-05-06 13:22 .bash_history
-rw-r--r-- 1 root root 18 2021-03-15 04:35 .bash_logout

오늘 생성한 파일

1
2
3
#  ls -al --time-style=+%D | grep `date +%D`
dr-xr-x--- 12 root root 4096 05/06/22 .
-rw------- 1 root root 28428 05/06/22 .bash_history

ps 명령

p는 사용자의 프로세스 PID, 명령어 등을 알 수 있다.

ps 명령어 출력 항목

이름 설명
USER (BSD)
UID (System V)
프로세스 소유자의 이름
PID 프로세스의 식별 번호
PPID 부모 프로세스의 PID
%CPU CPU 사용 비율의 추정치 (BSD)
%MEM Memory 사용 비율의 추정치(BSD)
VSZ K 단위 또는 페이지 단위의 가상 메모리 사용량
RSS 실제 메모리 사용량
TTY 프로세스와 연결된 터미널
S (System V)
STAT (BSD)
현재 프로세스의 상태 코드
TIME 총 CPU 사용 시간
COMMAND 프로세스의 실행 명령행
STIME 프로세스가 시작된 시간 혹은 날짜
C (System V)
CP (BSD)
짧은 기간 동안의 CPU 사용률
F 플래그
PRI 실제 실행 우선순위
NI nice 우선순위 번호

ps 명령 옵션:

옵션 설명
-A 모든 프로세스를 출력
a (BSD) 터미널과 연관된 프로세스를 출력, x 옵션과 같이 사용하여 모든 프로세스를 출력할 때 사용
-a 세션 리더를 제외하고 데몬 프로세스처럼 터미널에 종속되지 않은 모든 프로세스를 출력
-e 커널 프로세스를 제외한 모든 프로세스를 출력
-f 출력을 풀 포맷으로 표기 (유닉스 스타일). UID, PID , PPID 등이 함께 표시
-l(System V)
l (BSD)
출력을 긴 포맷으로 표기. 프로세스의 정보를 길게 보여주는 옵션으로 우선순위와 관련된 PRI 값과 NI 값을 확인
-o 출력 포맷을 지정
-M 64비트 프로세스들을 출력
-m 프로세스뿐만 아니라 커널 스레드도 출력
-p 특정 PID를 지정하여 출력
-r 현재 실행 중인 프로세스 출력
u (BSD) 프로세스의 소유자를 기준으로 출력
-u [사용자] 특정 사용자의 프로세스 정보를 출력, 사용자를 지정하지 않는다면 현재 사용자 기준으로 출력
x (BSD) 데몬 프로세스처럼 터미널에 종속되지 않은 프로세스를 출력
-x 로그인 상태에 있는 동안 아직 완료되지 않은 프로세스를 출력.
*유닉스 시스템은 사용자가 로그아웃한 뒤에도 임의의 프로세서가 계속 동작 가능 -> 해당 프로세서는 자신이 실행시킨 쉘이 없어도 계속 자신의 일을 수행하는 데 이 프로세스는 해당 옵션 없이는 확인이 불가능

모든 프로세스

프로세스 정보를 컬럼 UID PID PPID C STIME TTY TIME CMD 를 표시한다.

  • System V: -ef
  • BSD : aux

System V 계열 옵션을 사용한 모든 프로세스 보기

1
2
3
4
5
6
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Mar18 ? 00:00:10 /sbin/init
root 2 1 0 Mar18 ? 00:00:00 /init
root 8 2 0 Mar18 ? 00:00:00 plan9 --control-socket 7 --log-level 4 --server-fd 8 --pipe-fd 1
0 --log-truncate

BSD 계열 옵션을 사용한 모든 프로세스 보기

1
2
3
4
5
6
:~$ ps aux | more
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 22184 13372 ? Ss Mar18 0:10 /sbin/init
root 2 0.0 0.0 2776 1928 ? Sl Mar18 0:00 /init
root 8 0.0 0.0 2776 132 ? Sl Mar18 0:00 plan9 --control-socket 7 --log-level 4 --server-f
d 8 --pipe-fd 10 --log-truncate

프로세스의 긴 정보

  • -el : 모든 프로세스를 긴 정보 형식으로 출력: 한 F, S, PRI, NI 등 출력.
1
2
3
4
5
6
7
~$ ps -el |more
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 5546 - ? 00:00:10 systemd
5 S 0 2 1 0 80 0 - 694 - ? 00:00:00 init-systemd(Ub
0 S 0 8 2 0 80 0 - 694 - ? 00:00:00 init
4 S 0 50 1 0 79 -1 - 26934 - ? 00:00:06 systemd-journal
4 S 0 76 1 0 80 0 - 6106 - ? 00:00:23 systemd-udevd

tty 정보

ps -t [tty 명] : 해당 tty의 프로세스 출력

tty는 로그인 사용자 사용하는 시스템 터미널의 번호이다. 보통 로그인시 tty 에 접속되어 로그인 쉘이 가동되어 터미널에 접속하게 되고 가상의 pseudo terminal 번호를 사용한다.

다음은 pts 3번에 접속한 결과

1
2
$ tty
/dev/pts/3

해당 3번 터미널의 프로세스를 출력

1
2
3
4
$ ps -t 3
PID TTY TIME CMD
517366 pts/3 00:00:00 bash
543401 pts/3 00:00:00 ps

PID

ps -p PID : 해당 PID의 프로세스 정보를 출력

1
2
3
4
5
6
7
$ ps -p 517366
PID TTY TIME CMD
517366 pts/3 00:00:00 bash

$ ps -p 1
PID TTY TIME CMD
1 ? 00:00:10 systemd

사용자 아이디

`ps -u [사용자명]: 사용자 아이디에 해당하는 프로세스 정보를 출력

1
2
3
4
5
6
7
8
9
10
$ ps -u root
PID TTY TIME CMD
1 ? 00:00:10 systemd
2 ? 00:00:00 init-systemd(Ub
8 ? 00:00:00 init
50 ? 00:00:06 systemd-journal
76 ? 00:00:23 systemd-udevd
146 ? 00:00:00 cron
154 ? 00:00:01 systemd-logind
157 ? 00:00:02 wsl-pro-service

Filtering

grep, awk, cut 등 명령과 조합해 사용

grep

grep : 특정 문자열 찾는 명령어

1
2
3
4
[ grep  주요 옵션 ]
-i 대소문자 구분하지않고 검색
-n 줄 번호를 함께 출력
-x 패턴과 단어 전체가 일치하는 라인 출력

특정 파일내에서 특정 단어 찾기

1
grep "찾을 문자열"  FileName

ps 명령에서 특정 문자열 찾기

1
ps -ef |grep python

BSD 형식의 ps 명령 결과에서 찾기

1
ps aux | grep python

grep 명령어는 로그에서 특정 문자열로 검색할때 자주 사용하기도함

단어의 대소문자 구분없이 단어찾기

1
grep -i  "찾을 문자열"  FileName

몇번째 줄에 단어가 포함되어 있는지 찾기

1
grep -n "찾을 문자열" FileName

cut 명령령

AWK

1
ps -u qkboo -f | grep python | awk '{print $2, $9}'

파일 이름, 크기만 나오게 awk 사용

1
ls -lh / | awk -v OFS='\t' '{print $5, $9}