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)

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 에 저장된 마지막 세션이 복구되는 것을 확인할 수 있다.


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가 권장되는 최신, 안전, 고성능 옵션입니다.

bitbuket 에 SSH key 등록하기

github, bitbucket 같은 클라우드 사이트에 Client 프로그램으로 SSH 접속을 위해서는 SSH 키 쌍 생성하고 클라우드 사이트에 등록해야 한다. 보통 github, bitbucket 등 같은 SSH 접근을 지원하는 사이트는 ssh-agent forwarding 방식을 사용한다.

  1. 클라이언트에서 ssh 키 쌍을 생성
  2. 클라이언트에 개인키를 ssh-agent 에 등록
  3. 클라우드 서비스에 공개키를 등록
  4. 클라이언트 프로그램에서 ssh 사용시 ssh-agent 등록한 개인키로 암호화

여기서는 bitbucket 을 예로 들고 있다.

과정은 bitbucket 을 예로 들었지만 github 도 유사한 과정을 거친다. github에서 Key 등록에 대해서는 링크를 참조한다. github 에 SSH key 등록하기


SSH 구성과 2단계 인증

Git Credential Manager (GCM) 를 git client 에서 bitbucket 에 접속해 사용하는데 이용할 수 있다. SSH 구성을 하지 않고 bitbucket 을 사용하려면 GCM 을 사용하면 된다. Git Credential Manager

단, GCM works over HTTPS, not SSH. 그래서 git clone https://{username}@bitbucket.org/{workspace}/{repository}.git 이렇게 요청해야 한다.

설명에 따라서 먼저 ssh host key 를 생성하고 bitbucket 에서 사용하는 개인용 ssh key 를 만든다. 이후 bitbucket 에 등록하면 된다.

SSH Client Keys

저장소에 접근하는 url은 HTTPS or SSH 에 따라 달라진다.

  1. HTTPS

https://<repo_owner>@bitbucket.org/<accountname>/<reponame>.git

  1. SSH

git@bitbucket.org:<repo_owner>/<reponame>.git

or

ssh://git@bitbucket.org/<repo_owner>/<reponame>.git

bitbucket은 암호 알고리즘으로 keys: Ed25519, ECDSA, RSA, and DSA 를 지원한다.

예를 들어 아래 같이 생성한 공개키를 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
#Ed25519 (ed25519) / 256
$ ssh-keygen -t ed25519 -b 256

# ECDSA (ecdsa) / 256
$ ssh-keygen -t ecdsa -b 256

# RSA (rsa) / 2048
$ ssh-keygen -t rsa -b 2048

# DSA / DSS (dsa) / 1024
$ ssh-keygen -t dsa -b 1024

SSH Host Key 생성

아래는 bitbucket 서버의 공개키 이다.

1
2
3
256 SHA256:FC73VB6C4OQLSCrjEayhMp9UMxS97caD/Yyi2bhW/J0 bitbucket.org (ECDSA)
256 SHA256:ybgmFkzwOSotHTHLJgHO0QN8L0xErw6vd0VhFA9m3SM bitbucket.org (ED25519)
2048 SHA256:46OSHA1Rmj8E8ERTC6xkNcmGOw9oFxYr0WF6zWW8l1E bitbucket.org (RSA)

해당 공개키가 적적할지 확인은 다음 같이 curl 로 테스트해볼 수 있다.

1
curl https://bitbucket.org/site/ssh

개별키 생성

ssh 를 사용해서 bitbucket 클라우드에 접근하려면 사용하는 클라이언트에서 SSH 로 개인키와 공개키를 생성해야 한다. SSH 키를 생성하려면 아래 과정이 필요하다.

  1. Open SSH 설치
  2. SSH 서비스
  3. SSH 키 생성

여기서 Linux/macOS 그리고 Windows 11 에서 키 쌍을 생성해서 bitbucket에 등록하는 과정을 살펴보겠다.


Windows 11에서 키 생성

Windows 11 에서 Git 이 설치되어 있다고 가정.

1
2
3
> get-command git

Application git.exe 2.38.1.1 C:\Program Files\Git\cmd\git.exe

Openssh 확인

1
2
> ssh -V
OpenSSH_for_Windows_8.6p1, LibreSSL 3.4.3

ssh 명령 위치 확인

1
> Get-Command ssh

결과 ssh 명령을 git config 로 ssh 명령을 지정

1
git config --global core.sshCommand C:/Windows/System32/OpenSSH/ssh.exe

SSH agent 시작

git 이 ssh 키를 사용하려면 SSH agent 가 시작되어야 한다. 보통 Git for windows 와 Windows 11 이후 Windows OpenSSH 를 사용하므로

Windows OpenSSH 사용자는 다음 같이 agent를 확인하고 시작한다.

1
2
3
4
5
> Get-Service ssh-agent

Status Name DisplayName
------ ---- -----------
Stopped ssh-agent OpenSSH Authentication Agent

ssh-agent 서비스를 시작 하려면 Windows service에서 OpenSSH Authenticate Agent 서비스를 시작해 두어야 한다.

속성에서 시작으로 한다.

서비스가 정상적으로 시작되면 아래 명령으로 시작/종료 그리고 재시작을 할 수 있다. - 시작 안되어 있으면 알수없는 에러가 난다.

1
> Start-Service ssh-agent

Git for windows 를 사용하면 Git for windows의 bash 터미널 에서 다음 같이 확인하고 시작한다.

1
$ ps -a | grep ssh-agent

ssh-agent 를 시작한다.

1
$ eval $(ssh-agent)

에이젼트가 시작되면 git client 에서 ssh 정보를 얻을 수 있다.

bitbucket에 사용할 SSH key pair를 생성

ssh-keygen.exe로 키 쌍, 비밀키/공개키를 생성한다. 키를 생성시 bitbucket 계정의 e-mail 을 포함해 생성한다. 생성시 사용자 홈 디렉토리 .ssh 디렉토리에서 작업한다.

1
> ssh-keygen.exe -t rsa -b 4096 -C "EMAIL" -f "KEY_FILE"
  • EMAIL: bitbucket 계정 이메일
  • KEY_FILE: 파일 이름. 보통 bitbucket_work

.ssh 디렉토리에 키 쌍 KEY_FILE 과 KEY_FILE.pub 이 생성된다.

1
2
3
4
5
6
7
8
9
10
> dir .ssh

Directory: C:\Users\daddy\.ssh

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2023-06-25 오후 6:11 3381 bitbucket_work
-a--- 2023-06-25 오후 6:11 744 bitbucket_work.pub
-a--- 2020-11-08 오전 12:12 1675 id_rsa
-a--- 2020-11-08 오전 12:12 404 id_rsa.pub

이제 키를 SSH Agent 에 등록하자.

SSH Agent 에 키 등록

키 파일을 SSH Agent 에 등록한다. KEY_FILE 은 비밀키 파일을 지정하면 된다.

1
> ssh-add ~/.ssh/KEY_FILE

그리고 명확하게 bitbucket 에 해당 키를 사용하도록 ~/.ssh/config 에 아래 같이 등록한다.

1
2
3
Host bitbucket.org
AddKeysToAgent yes
IdentityFile ~/.ssh/KEY_FILE

macOS / Linux

Openssh 확인

1
2
$ ssh -V
OpenSSH_8.2p1 macOS, OpenSSL 1.1.1f 31 Mar 2020

ssh 명령이 없으면 macOS는 brew 로 설치한다.

1
$ brew install openssh

Linux 는 apt, dnf, pacman 을 사용해 설치한다.

1
$ sudo apt update && sudo apt install openssh-client

SSH agent 시작

git 에서 ssh 키를 사용하려면 SSH agent 가 시작한다. bash 터미널 에서 다음 같이 확인하고 시작한다.

1
$ ps -a | grep ssh-agent

ssh-agent 를 시작한다.

1
$ eval $(ssh-agent)

이 명령을 ~/.bashrc, ~/.zshrc, ~/.profile, 등에 등록해 둔다. 에이젼트가 시작되면 git client 에서 ssh 정보를 얻을 수 있다.

bitbucket에 사용할 SSH key pair를 생성

ssh-keygen.exe로 키 쌍, 비밀키/공개키를 생성한다.

  • 키를 생성시 bitbucket 계정의 e-mail 을 포함해 생성한다.
  • 사용자 홈 디렉토리 .ssh 디렉토리에서 작업한다.
1
$ ssh-keygen -t rsa -b 4096 -C "EMAIL" -f "KEY_FILE"
  • EMAIL: bitbucket 계정 이메일
  • KEY_FILE: 파일 이름. 보통 bitbucket_work

.ssh 디렉토리에 키 쌍 KEY_FILE 과 KEY_FILE.pub 이 생성된다.

1
2
3
4
5
6
7
8
$ ls -l .ssh

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2023-06-25 오후 6:11 3381 bitbucket_work
-a--- 2023-06-25 오후 6:11 744 bitbucket_work.pub
-a--- 2020-11-08 오전 12:12 1675 id_rsa
-a--- 2020-11-08 오전 12:12 404 id_rsa.pub

이제 키 쌍를 SSH Agent 에 등록하자.

SSH Agent 에 키 등록

키 파일을 SSH Agent 에 등록한다. KEY_FILE 은 비밀키 파일을 지정하면 된다.

1
$ ssh-add ~/.ssh/KEY_FILE

그리고 명확하게 bitbucket 에 해당 키를 사용하도록 ~/.ssh/config 에 아래 같이 등록한다.

1
2
3
Host bitbucket.org
AddKeysToAgent yes
IdentityFile ~/.ssh/KEY_FILE

Bitbucket Cloud with your public key

bitbucket 을 위해 생성한 키 쌍에서 공개키 KEY_FILE.pub 를 bitbucket 의 계정에 등록해 주어야 한다.

  1. Settings -> Personal Settings
  1. Secutiry -> SSH Keys -> Add key

생성한 키 쌍에서 bitbucket_work.pub 같이 공개키를 등록하는데, 공개키 파일 내용을 복사해 붙여넣기를 하면 된다.

cat 명령 등으로 내용을 복사한다.

1
2
3
4
5
> cat .\.ssh\bitbucket_work.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDo+7VGfxlhxFsy0Edu+PPmqngJVzwLQuLPanOi5x8t2yu7RmFNlEfU32AgA7vkoLno98XFZaUZ3ZjMwVu7LWeLMNczx5nH//
...
...
+v7ttamzvFe8idOtCjJszG5l8rn4poIN2E24AWGvCGbzs55WRXY/amYEqP5/maH0NT+pYM2ZMV7Nt8Jb86iQ== james@thinkbee.kr

사이트의 Add key 창에 붙여 넣는다.

이제 새 SSH 키가 등록되었다.

클라이언트에서 bitbucket 에 SSH 접속이 가능한지 테스트한다. 단, 모든 SSH 연결은 최초 접속시 호스트 접속 여부를 묻는다. 아래 같이 bitbucket.org 접속시 접속 여부를 묻는 다이얼로그가 나온다.

1
2
3
4
5
6
7
8
9
$ ssh -T git@bitbucket.org
The authenticity of host 'bitbucket.org (104.192.141.1)' can't be established.
ED25519 key fingerprint is SHA256:ybgmFkzwOSotHTHLJgHO0QN8L0xErw6vd0VhFA9m3SM.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'bitbucket.org' (ED25519) to the list of known hosts.
authenticated via ssh key.

You can use git to connect to Bitbucket. Shell access is disabled

결과적으로 아래 같이 결과가 출력되면 성공한 상태다.

1
2
3
authenticated via ssh key.

You can use git to connect to Bitbucket. Shell access is disabled

이제 git 클라이언트에서 HTTPS, SSH 를 통해서 bitbucket 과 ssh 연결이 가능하다. git 클라이언트로 push, pull 등을 수행할 수 있다.


참고

  1. https://support.atlassian.com/bitbucket-cloud/docs/configure-ssh-and-two-step-verification/
  2. github 에 SSH key 등록하기

github 에 SSH key 등록하기

github, bitbucket 같은 클라우드 사이트에 Client 프로그램으로 SSH 접속을 위해서는 SSH 키 쌍 생성하고 클라우드 사이트에 등록해야 한다.

보통 github, bitbucket 등 같은 SSH 접근을 지원하는 사이트는 ssh-agent forwarding 방식을 사용한다.

  1. 클라이언트에서 ssh 키 쌍을 생성
  2. 클라이언트에 개인키를 ssh-agent 에 등록
  3. 클라우드 서비스에 공개키를 등록
  4. 클라이언트 프로그램에서 ssh 사용시 ssh-agent 등록한 개인키로 암호화

여기서는 github 에 ssh key 등록 과정을 요약하고 있다.


SSH 구성과 SSH 인증

먼저 ssh host key 를 생성하고 github 과 사용할 개인 key 를 만든다. 개인키를 ssh-agent 방식으로 등록하고 공개키를 github 에 등록하면 된다.

ssh-agent 키 관리

로컬 머신에서 사용하는 SSH Key 쌍에 대한 접근을 ssh-agent 를 통해서 진행한다. managing deploy keys 에 설명되어 있다.

  • 에이전트 전달은 로컬 개발 컴퓨터에서 사용하는 것과 동일한 SSH 키를 사용합니다.
  • 단 사용자 클라이언트에 SSH에 있어야 합니다

SSH Client Keys

저장소에 접근하는 url은 HTTPS or SSH 에 따라 달라진다.

  1. HTTPS

https://<repo_owner>@github.com/<accountname>/<reponame>.git

  1. SSH

git@github.com:<repo_owner>/<reponame>.git

or

ssh://git@github.com/<repo_owner>/<reponame>.git

github은 암호 알고리즘으로 keys: Ed25519, ECDSA, RSA, and DSA 를 지원한다.

예를 들어 아래 같이 생성한 공개키를 사용할 수 있다.

1
2
3
4
5
6
7
8
#Ed25519 (ed25519) / 256
$ ssh-keygen -t ed25519 -b 256

# ECDSA (ecdsa) / 256
$ ssh-keygen -t ecdsa -b 256

# RSA (rsa) / 2048
$ ssh-keygen -t rsa -b 4096

개별키 생성

ssh 를 사용해서 github 에 접근하려면 사용하는 클라이언트에서 SSH 로 개인키와 공개키를 생성해야 한다. SSH 키를 생성하려면 아래 과정이 필요하다.

  1. Open SSH 설치
  2. SSH 서비스
  3. SSH 키 생성

여기서 Linux/macOS 그리고 Windows 11 에서 키 쌍을 생성해서 github에 SSH Key를 등록하는 과정을 살펴보겠다.


Windows 11에서 키 생성

Windows 11 에서 Git 이 설치되어 있다고 가정.

1
2
3
> get-command git

Application git.exe 2.38.1.1 C:\Program Files\Git\cmd\git.exe

Openssh 확인

1
2
> ssh -V
OpenSSH_for_Windows_8.6p1, LibreSSL 3.4.3

ssh 명령 위치 확인

1
> Get-Command ssh

결과 ssh 명령을 git config 로 ssh 명령을 지정

1
git config --global core.sshCommand C:/Windows/System32/OpenSSH/ssh.exe

SSH agent 시작

git 이 ssh 키를 사용하려면 SSH agent 가 시작되어야 한다. 보통 Git for windows 와 Windows 11 이후 Windows OpenSSH 를 사용하므로

Windows OpenSSH 사용자는 다음 같이 agent를 확인하고 시작한다.

1
2
3
4
5
> Get-Service ssh-agent

Status Name DisplayName
------ ---- -----------
Stopped ssh-agent OpenSSH Authentication Agent

ssh-agent 서비스를 시작 하려면 Windows service에서 OpenSSH Authenticate Agent 서비스를 시작해 두어야 한다.

속성에서 시작으로 한다.

서비스가 정상적으로 시작되면 아래 명령으로 시작/종료 그리고 재시작을 할 수 있다. - 시작 안되어 있으면 알수없는 에러가 난다.

1
> Start-Service ssh-agent

Git for windows 를 사용하면 Git for windows의 bash 터미널 에서 다음 같이 확인하고 시작한다.

1
$ ps -a | grep ssh-agent

ssh-agent 를 시작한다.

1
$ eval $(ssh-agent)

에이젼트가 시작되면 git client 에서 ssh 정보를 얻을 수 있다.

github에서 사용할 SSH key pair를 생성

ssh-keygen.exe로 키 쌍, 비밀키/공개키를 생성한다. 키를 생성시 bitbucket 계정의 e-mail 을 포함해 생성한다. 생성시 사용자 홈 디렉토리 .ssh 디렉토리에서 작업한다.

1
> ssh-keygen.exe -t ed25519  -b 4096 -C "EMAIL" -f "KEY_FILE"
  • EMAIL: github 계정 이메일
  • KEY_FILE: 파일 이름. 보통 bitbucket_work

참고: Ed25519 알고리즘을 지원하지 않는 레거시 시스템을 사용하는 경우 다음을 사용합니다.

1
>$ ssh-keygen -t rsa -b 4096 -C "EMAIL" -f "KEY_FILE"

.ssh 디렉토리에 키 쌍 KEY_FILE 과 KEY_FILE.pub 이 생성된다.

1
2
3
4
5
6
7
8
9
10
> dir .ssh

Directory: C:\Users\daddy\.ssh

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2023-06-25 오후 6:11 3381 bitbucket_work
-a--- 2023-06-25 오후 6:11 744 bitbucket_work.pub
-a--- 2020-11-08 오전 12:12 1675 id_rsa
-a--- 2020-11-08 오전 12:12 404 id_rsa.pub

이제 키를 SSH Agent 에 등록하자.

SSH Agent 에 키 등록

키 파일을 SSH Agent 에 등록한다. KEY_FILE 은 비밀키 파일을 지정하면 된다.

1
> ssh-add ~/.ssh/KEY_FILE

그리고 명확하게 github 에 해당 키를 사용하도록 ~/.ssh/config 에 아래 같이 등록한다.

1
2
3
Host github.com
AddKeysToAgent yes
IdentityFile ~/.ssh/KEY_FILE

macOS / Linux

Openssh 확인

1
2
$ ssh -V
OpenSSH_8.2p1 macOS, OpenSSL 1.1.1f 31 Mar 2020

ssh 명령이 없으면 macOS는 brew 로 설치한다.

1
$ brew install openssh

Linux 는 apt, dnf, pacman 을 사용해 설치한다.

1
$ sudo apt update && sudo apt install openssh-client

SSH agent 시작

git 에서 ssh 키를 사용하려면 SSH agent 가 시작한다. bash 터미널 에서 다음 같이 확인하고 시작한다.

1
$ ps -a | grep ssh-agent

ssh-agent 를 시작한다.

1
$ eval $(ssh-agent)

이 명령을 ~/.bashrc, ~/.zshrc, ~/.profile, 등에 등록해 둔다. 에이젼트가 시작되면 git client 에서 ssh 정보를 얻을 수 있다.

github에 사용할 SSH key pair를 생성

ssh-keygen.exe로 키 쌍, 비밀키/공개키를 생성한다.

  • 키를 생성시 bitbucket 계정의 e-mail 을 포함해 생성한다.
  • 사용자 홈 디렉토리 .ssh 디렉토리에서 작업한다.
1
$ ssh-keygen -t rsa -b 4096 -C "EMAIL" -f "KEY_FILE"
  • EMAIL: bitbucket 계정 이메일
  • KEY_FILE: 파일 이름. 보통 bitbucket_work

참고: Ed25519 알고리즘을 지원하지 않는 레거시 시스템을 사용하는 경우 다음을 사용합니다.

1
>$ ssh-keygen -t rsa -b 4096 -C "EMAIL" -f "KEY_FILE"

.ssh 디렉토리에 키 쌍 KEY_FILE 과 KEY_FILE.pub 이 생성된다.

1
2
3
4
5
6
7
8
$ ls -l .ssh

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2023-06-25 오후 6:11 3381 bitbucket_work
-a--- 2023-06-25 오후 6:11 744 bitbucket_work.pub
-a--- 2020-11-08 오전 12:12 1675 id_rsa
-a--- 2020-11-08 오전 12:12 404 id_rsa.pub

이제 키 쌍를 SSH Agent 에 등록하자.

SSH Agent 에 키 등록

키 파일을 SSH Agent 에 등록한다. KEY_FILE 은 비밀키 파일을 지정하면 된다.

1
$ ssh-add ~/.ssh/KEY_FILE

그리고 명확하게 bitbucket 에 해당 키를 사용하도록 ~/.ssh/config 에 아래 같이 등록한다.

1
2
3
Host github.com
AddKeysToAgent yes
IdentityFile ~/.ssh/KEY_FILE

github 에 public key 등록하기

github 계정의 SSH and GPG keys에서 등록해 주어야 한다. 키 쌍 중 공개키 KEY_FILE.pub 내용을 등록해 준다.

  1. Settings -> Personal Settings
' >

cat 명령 등으로 내용을 복사한다. 사이트의 Add key 창에 붙여 넣는다.

클라이언트에서 github SSH 접속이 가능한지 테스트한다. 단, 모든 SSH 연결은 최초 접속시 호스트 접속시 접속 여부를 묻는 다이얼로그가 나온다.

결과적으로 아래 같이 결과가 출력되면 성공한 상태다.

1
2
3
$ $ ssh -T git@github.com

Hi USER! You've successfully authenticated, but GitHub does not provide shell access.

이제 git 클라이언트에서 HTTPS, SSH 를 통해서 github 과 ssh 연결이 가능하다. git 클라이언트로 push, pull 등을 수행할 수 있다.


참고

  1. Connect with SSH, github
  2. SSH 연결 테스트, github
  3. bitbucket 에 SSH key 등록하기

Linux - X Forwarding

SBC 보드 (raspberry pi, odroid c2 등)를 Terminal 기반으로 사용하려고 할 때 GUI에서 Programming을 확인해야 할 경우 X11, VNC 등을 이용할 수 있다. 여기서는 X Forwarding 기법을 정리하고 있다.

[^1]: Single Board Computer

X11 Forwarding

X11은 유닉스/리눅스의 전통적 데스크탑 프로토콜로 GUI 데스크탑 환경을 X11 Protocol을 사용해서 로컬 혹은 원격지 컴퓨터에서 이용할 수 있게 설계되어 있다.

X Windows: X ming

윈도우즈에서 X ming 환경을 구축하면 X window system을 사용할 수 있다.

자세히 보기

Linux - ssh-sshfs

ssh 사용 팁과 sshfs 이용 방법에 대해서 정리한다.

ssh

터미널에서 ssh를 사용하는데 이용하는 구성과 설정을 정리했다.

비밀키 이용

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

1. ssh 클라이언트

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

1
(CLIENT)$ ssh-keygen -t rsa -b 4096 -C "USER@localhost"

2. ssh 서버

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

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

서버에 공개키 배포

클라이언트에 생성한 공개키 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'

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

ssh config 사용하기

사용자를 위한 ssh 구성을 하려면 ~.ssh/config 설정 파일을 이용한다.

keep alive session

ssh 접속시 옵션을 주어 세션 유지 시간을 지정할 수 있다.

ServerAliveInterval 사용

접속시 ServerAliveInterval=TICK를 사용하면 TICK초 마다 한번씩 ServerAliveInterval를 보낸다.

옵션을 직접 사용하거나 ~/.ssh/config 설정 파일에 지정해 둘 수 있다.

ssh 접속시 -o 옵션으로 지정한다.

1
ssh -o ServerAliveInterval=10 192.168.0.1

~/.ssh/config 이용

사용자의 ssh 설정 파일은 ~/.ssh/config 이다.

1
2
3
4
5
# For all hosts
ServerAliveInterval 20
# For a selection of hosts
Host 192.168.0.1 192.168.1.1
ServerAliveInterval 20

시스템 전체에 적용한다면 /etc/ssh_config 에 (혹은 데비안 계열은 /etc/ssh/ssh_config) 지정해도 된다.


## sshfs

원격 호스트에서 작업중인 소스등을 편집하는데 터미널로 접속해 vim, nano 같은 편집 도구를 이용할 수 있지만, 개발 컴퓨터에서 손에 익은 GUI 개발 도구를에서 개발하고 편집해서, 원격 호스트에서 실행하는 방법을 선호해서 sshfs를 이용하고 있다.

보통 Sublime Text, TextMate 등의 에디터에서 파이썬 등의 프로그래밍 코드를을 작성하고 sshfs를 이용해 원격 디렉토리에 저장하는 방법을 사한다.

설치

Ubuntu/Debian

1
$sudo apt install sshfs

Mac OS X

Mac OS X Fuse 설치

sshfs 설치후 재시동 필요.

Window

다음 설치 파일을 받아 설치한다.
https://win-sshfs.googlecode.com/files/win-sshfs-0.0.1.5-setup.exe

Mac OS X 사용

Mac OS X에서는 OSXFuse를 사용해서 사용자 계정에서 sshfs를 이용한다. 그래서 sudo 명령을 사용하지 않는다.

1
$ sshfs USER_ID@xxx.xxx.xxx.xxx:/ /Volume/remote

sudo 명령을 이용해서 마운트할 경우 마운트 포인트를 찾지 못해서 다음 같은 에러가 난다.

1
2
$ ls
ls: odoomodules: No such file or directory

Ubunto/Debian

1
sudo sshfs USER_ID@xxx.xxx.xxx.xxx:/ /Volume/remote

사용후 언마운트는 다음과 같다.

1
$sudo umount /Volume/remote

마운트 고정: Mac OS X

https://amaral.northwestern.edu/resources/guides/mounting-remote-folder-os-x-over-ssh

파일 /etc/fstab

1
sshfs#USER_ID@xxx.xxx.xxx.xxx:/ /Volume/remote
DS_Store 파일

OS X는 파일을 다룰 때 .DS_Store 파일로 폴더를 지저분하게 한다. 이것을 비활성화 할 수 있다.
마운트할 때 noappledouble 옵션을 사용한다.

1
2
$ mkdir ~/example
$ sshfs user@host:/example ~/example -oauto_cache,reconnect,defer_permissions,negative_vncache,noappledouble,volname=Example

Mounting an OSX SSH Volume using FUSE and SSHFS

ssh authentication

1
sudo sshfs -o IdentityFile=~/.ssh/id_rsa USER_ID@xxx.xxx.xxx.xxx:/ /Volume/remote

자주사용하는 sshfs 명령

1
2
$ mkdir ~/example
$ sshfs user@host:/example ~/example -oauto_cache,reconnect,defer_permissions,negative_vncache,noappledouble,volname=Example

sshfs options

sshfs 구현마다 조금 다르지만 https://linux.die.net/man/1/sshfs 에서 옵션 내용을 조금 살펴보자:

  • -o reconnect : reconnect to server
  • -o delay_connect : delay connection to server
  • o sshfs_sync: synchronous writes
  • -o no_readahead: synchronous reads (no speculative readahead)
  • -o sshfs_debug: print some debugging information
  • -o cache=BOOL: enable caching {yes,no} (default: yes)
  • -o cache_timeout=N: sets timeout for caches in seconds (default: 20)
  • -o cache_X_timeout=N: sets timeout for {stat,dir,link} cache
  • -o workaround=LIST: colon separated list of workarounds
  • none: no workarounds enabled
  • all: all workarounds enabled

cache

느린 네트워크에서는 캐시를 끄고 사용하는게 좋겠다.

  • -o cache=YESNO: enable caching {yes,no} (default: yes)
  • -o cache_timeout=N : sets timeout for caches in seconds (default: 20)
  • -o cache_X_timeout=N : sets timeout for {stat,dir,link} cache

보증된 네트워크에서 암호화 없이 mount

sshd 가 암호화를 지원하는 상황에서 안된다.

안전한 네트워크에서는 Ciphers, Compression 옵션을 사용 ^Blazingly fast sshfs 하면 빠른 속도를 얻을 수 있다.

1
sshfs -o Ciphers=arcfour -o Compression=no server://some/folder /mnt/some_local_folder
  • Ciphers=arcfour : 빠른 암호화 메서드, 다만 안전하지 않다.
  • Compression : ssh 내장 압축 사용하지 않는다.

rsync 에도 사용할 수 있다.

1
rsync -e"ssh -c arcfour -o Compression=no" ...rest of rsync cmd...

TCP Optimization

MTU(Maximum Transmission Unit)

네트워크 인터페이스에서 세그먼트 없이 보낼수 있는 최대 데이터그램 크기 값입니다. 만약 데이터가 MTU 값 이상이라면 여러개의 패킷으로 분할이 될 것입니다. 간단하게 보자면 MTU 는 패킷이 한번에 보낼 수 있는 최대 크기라고 볼 수 있습니다.

이더넷의 MTU 값은 일반적으로 1500 바이트이며 옛날에 모뎀을 통해 접속하던 PPPoE 연결은 1492 바이트를 가지고 있습니다.

MTU 는 각 패킷 프레임안에 최대 전송할 수 있는 값 MSS(Maximum segment size) 가 정의되어 있습니다. 그렇다면 MTU는 MSS + TCP/IP 헤더 크기가 될 것이고 반대로 MSS 는 MTU - 40 바이트가 됩니다. 40 바이트는 IP 와 TCP 헤더 20 바이트씩을 뜻합니다.

Linux

리눅스에서 MTU 값은 ifconfig 명령으로 확인할 수 있다.

1
2
3
4
5
6
7
8
9
$ ifconfig eth0
eth0 Link encap:Ethernet HWaddr b8:27:eb:c8:5f:4b
inet addr:220.121.140.239 Bcast:220.121.140.255 Mask:255.255.255.0
inet6 addr: fe80::ba27:ebff:fec8:5f4b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1633606 errors:0 dropped:44758 overruns:0 frame:0
TX packets:73808 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:85875027 (81.8 MiB) TX bytes:22615535 (21.5 MiB)

기본 MTU가 1500인데 이 값을 조정하려면 sudo ifconfig 명령으로 할 수 있다.

1
$ sudo ifconfig eth0 mtu 9000

재시동 후에도 지속적으로 MTU 값을 유지하고 싶으면 /etc/network/interfaces 에 명시하면 된다.

1
2
3
4
5
auto eth0
iface eth0 inet static
address 192.168.0.2
netmask 255.255.255.0
mtu 9000
링크

MTU

SSHFS-MUX

http://www.linux-magazine.com/Issues/2014/165/SSHFS-MUX

Error

에러 mount_osxfuse: the file system is not available (255)

There appears to be a problem loading the KEXT installed by the regular osxfuse Homebrew package. You can use brew cask to install the official FUSE for OS X build from their own DMG:

1
2
3
brew rm osxfuse
brew install caskroom/cask/brew-cask
brew cask install osxfuse

참조

ssh 관련 사용 옵션

SSH Usages

Ssh timeout

ssh를 사용시 접속 시간이 지나면 자동 끎김을 막아주는 옵션들이 있다.

운영하는 서버는 보안상 alive 메시지를 모두 막아 두었다.
다만, ssh 접속시 ServerAliveInterval 을 사용해서 클라이언트가 alive 메시지를 서버에 있다.

sshd

sshd 데몬은 클라이언트 접속후 sshd_config에 구성한 설정데로 alive 메시지를 클라이언트에 주고 받아 접속 시간을 연장할 수 있다. 아래 그림 [^1]

1
2
3
4
5
6
7
8
9
10
11
# alive 메시지 사용 결정
#TCPKeepAlive yes # 기본 yes.

# 클라이언트가 살아있는지 확인하는 간격.
ClientAliveInterval 60 # 기본 0.
# 클라이언트에서 응답이 없을 때 메시지를 보내는 횟수
ClientAliveCountMax 3 # 확인 횟수

# Login Prompt에서 사용자 입력을 기다리는 시간을 초 단위로 입력.
LoginGraceTime 20 #( 1m: 기본 1분지정, 0은 시간제한없음)

ssh 옵션

ssh 사용시 /etc/ssh/ssh_config 구성 파일에 있는 ServerAliveInterval 옵션을 사용하면 ssh 접속시 alive 메시지를 서버가 클라이인트에게 주어진 시간 간격으로 보낸다.

[그림. ServerAliveInterval]

ssh_config 파일에 구성하거나 ssh 사용시 -o ServerAliveInterval 옵션을 사용하는 방법 두 가지가 있다.

ssh -o

ServerAliveInterval option every time you’re connecting to a server by using the -o ServerAliveInterval= prefix as the following example;

1
ssh -o ServerAliveInterval=300 user@example.com

key파일 사용

키파일 이용

키파일을 원하는 위치에 복사하고 퍼미션을 400으로 조정합니다. (저는 ~/Desktop/key/로 정했습니다.)

1
$ chmod 400 ~/Desktop/key/keyfile.pem

터미널에서 키파일 옵션을 추가한 명령으로 ssh 접속

1
$ ssh -i ~/Desktop/key/keyfile.pem ec2-user@[서버 아이피 또는 도메인]

포트가 다르다면

1
$ ssh -i ~/Docments/cloud-server.pem root@220.11.11.173 -p 8888

서버 키 생성

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

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

scp -i /Documents/ncloud-key/qkbooo-ncloud.pem ~/.ssh/id_rsa.pub root@210.89.190.173:/ -p 2525

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

포트변경 사용

rsync 포트 사용

rsync에서 다른 ssh 포트를 사용하고 있을 경우 아래와 같이 옵션을 붙여준다.

1
$ rsync -e 'ssh -p 0000'

혹은

1
rsnyc --rsh'=ssh -p0000'

참조

[^1]: How to keep your ssh connection