상세 가이드 · 11 / 15

원격 페더레이션 (ssh)

ssh 너머 다른 머신의 pytmux 서버 탭을 지금 화면에 끌어와, 로컬 탭과 원격 탭을 한 창에서 섞이지 않게 함께 씁니다.

붙이기 · 분홍 탭

remote-attach <host> 로 ssh 너머 다른 머신의 pytmux 서버에 붙습니다. 원격 탭은 탭바·외곽선을 분홍색으로 구분하며, 로컬 탭과 섞이지 않습니다. 원격 서버가 없으면 분리 서버를 자동 기동합니다(PYTMUX_NO_REMOTE_AUTOSTART=1 로 opt-out). 전송은 ssh -T 이며, 접속 대상·인증은 사용자의 ssh 설정(~/.ssh/config· known_hosts·키)을 그대로 따릅니다.

원격 attach 화면 — 분홍 탭으로 구분
원격 attach — 원격 탭을 분홍색으로 구분합니다.

원격 탭 다루기

명령동작
remote-attach <host>원격 서버의 탭들을 붙이기
remote-attach <C> via <B>B 를 거쳐 C 에 붙이기(다중홉 — C 로 직접 ssh 가 안 될 때, 아래 절)
remote-new-tab원격에 새 터미널을 만들어 새 탭으로 붙이기
merge-remote-tab같은 원격 서버의 다른 탭을 현재 탭에 패널로 합치기(피커)
remote-detach [host]원격 호스트 떼어내기(비우면 전체). 원격 탭의 [x]그 탭 하나만 분리합니다(같은 호스트의 다른 원격 탭은 그대로)

원격 탭도 고정(핀)할 수 있습니다(다운스트림 로컬 뷰 기준). 이 핀은 호스트 기준으로 기억해, 같은 호스트에 다시 remote-attach 하거나 끊겨서 자동 재연결돼도 유지됩니다 — 그 사이 원격에 새로 생긴 탭만 비고정으로 붙고, 없어진 탭의 핀은 사라집니다. remote-detach 로 직접 떼어내면 그 호스트의 핀은 잊습니다(다시 붙이면 전부 비고정). 원격에서 pytmux 를 다시 돌리는 중첩 상황은 그 패널의 실제 ssh 목적지로 자동 승격됩니다 (nest-auto-attach, 기본 onnest-auto-attach off 로 끄면 거부).

중간 상자를 거쳐 붙기 (다중홉, via)

내 컴퓨터에서 목적지로 ssh 가 곧바로 되지 않고 징검다리 서버를 거쳐야 하는 구성 (사내망 안쪽 등)에서는 remote-attach <C> via <B>B 를 거쳐 C 에 붙습니다. 붙은 뒤 동작은 1홉과 같습니다 — 탭은 분홍색으로 구분되고, 화면·입력·이름 바꾸기·토큰 회계가 모두 그대로 흐릅니다. 탭 이름은 ⇄B>C:이름 이고, 떼어낼 때의 인자도 같은 B>C 입니다 (remote-detach B>C).

# 지금 이 화면의 명령 프롬프트(prefix :)에서 — B 를 거쳐 C 의 탭들을 붙인다 :remote-attach C via B

중계는 B 에서 도는 pytmux relay-proxy <C> 가 맡습니다. 그래서 B 에도 pytmux 가 설치돼 있어야 하고, B→C 의 접속·인증은 B 의 ssh 설정 (~/.ssh/config·known_hosts·키)을 따릅니다. 겹쳐 쓴 ssh 명령 문자열이 아니라 고정된 인자로 부르기 때문에 B 의 셸이 해석할 것이 없고, 중계 상자가 자기 허용 목록(opts.jsonremote_allowed_hosts)으로 어디까지 중계할지 스스로 정합니다 — 허용 밖이면 B 가 거절합니다. 홉은 한 단까지로, 중계 상자를 또 다른 중계로 겹쳐 쓰지는 않습니다.

실패하면 어느 홉에서 막혔는지가 문구로 갈립니다 — 중계 상자 B 가 C 로의 중계를 거부, 중계 상자 B 에서 pytmux 를 찾지 못했습니다, B→C 홉 실패. 거쳐 가는 경로는 링크에 함께 저장돼, 끊겼을 때의 자동 재연결작업 보존 재시작 뒤의 링크 복원이 홉을 잃지 않습니다(1홉으로 조용히 되살아나지 않습니다).

via 와 캐스케이드는 다른 것입니다. via한 링크가 여러 홉을 품는 것(A 가 C 를 직접 보고, B 는 길목일 뿐)이라 표기가 ⇄B>C: 입니다. 반면 B 가 자기 원격 탭으로 C 를 보고 있는데 내가 그 B 에 붙으면 C 의 탭까지 따라옵니다(캐스케이드) — 이때는 한 번만 찍고 거쳐 온 머신을 : 로 이어 ⇄B:C:이름 으로 보입니다. 어느 쪽이든 원격 탭의 고정(핀)탭 하나만 분리는 내가 지목한 그 탭에 붙습니다.

원격 서버를 상주시키기 (exit-empty)

pytmux 서버는 tmux 와 마찬가지로 세션이 하나도 남지 않으면 스스로 종료합니다. 내 컴퓨터에서는 자연스럽지만, 붙어 쓰는 원격 머신에서는 거기서 마지막 탭을 exit 한 순간 서버가 사라져 연결까지 끊깁니다. 그 머신에서 exit-empty off 로 꺼 두면 서버가 빈 채로 상주하고, 다시 새 탭을 만드는 순간 세션이 그 자리에서 되살아납니다 — 그 머신에서 직접 pytmux 로 붙어도, 여기서 remote-new-tab 을 보내도 마찬가지입니다.

# 원격 머신에서 (셸에서 직접, 또는 그 서버에 붙은 상태에서 `:exit-empty off`) pytmux cmd exit-empty off

기본값은 종전과 같은 on 이고, :settings → 동작 → 세션 0개 시 종료 에서도 바꿀 수 있습니다(값은 서버에 영속). kill-server 처럼 명시적으로 끝내는 명령은 이 설정과 무관하게 늘 종료합니다.

여러 기기에서 볼 때 화면 크기 (호스트 SSH keepalive 권장)

한 원격 서버를 여러 기기가 동시에 보면, 화면은 tmux 처럼 기본적으로 가장 작은 화면에 맞춰집니다(smallest — 남는 영역은 빈 여백 띠로 채워집니다). 어떤 기기가 정상 종료 없이 끊기면(노트북 절전·네트워크 단절 등) 그 유령 접속이 남아 화면을 계속 작게 붙잡을 수 있습니다. 지금 화면에서 detach -a(다른 접속 내보내기)로, 또는 그 접속을 가진 기기에서 remote-detach 로 정리되지만, 유령을 근본적으로 막으려면 원격 서버를 여는 호스트의 SSH 데몬이 죽은 접속을 스스로 끊게 해 두는 것이 좋습니다.

여백 띠가 유령이 아니라 진짜 작은 기기 때문이라면, window-size(별칭 winsize)로 공유 격자 크기 기준을 바꿀 수 있습니다(tmux 동형). :settings → 동작 → window-size 에서도 고를 수 있고, 값은 서버에 영속됩니다.

공유 격자 크기
smallest (기본)가장 작은 접속에 맞춤 — 아무도 잘리지 않지만 큰 화면엔 여백 띠가 남습니다.
latest마지막으로 조작한(입력·마우스·스크롤·리사이즈) 접속의 크기에 맞춤. 아직 아무 조작도 없으면 smallest 로 폴백합니다.
largest가장 큰 접속에 맞춤.
잘림 주의. latest·largest 에서는 작은 접속이 공유 격자를 다 담지 못해 오른쪽·아래가 잘립니다(여백 띠가 아니라 잘림 — 하나의 공유 격자를 나눠 보는 구조의 한계로, tmux 도 같은 트레이드오프입니다). 그래서 기본은 아무도 안 잘리는 smallest 입니다.

macOS · Linux — 호스트에서 드롭인 한 파일(관리자 권한):

# /etc/ssh/sshd_config.d/50-pytmux-keepalive.conf ClientAliveInterval 15 ClientAliveCountMax 3

45초(15초 × 3회) 무응답이면 죽은 접속으로 보고 끊습니다. macOS 는 접속마다 sshd 를 새로 띄우므로 재시작 없이 다음 접속부터 적용됩니다. Linux 는 sudo systemctl reload ssh(배포판에 따라 sshd)로 반영합니다. 드롭인 디렉토리가 없으면 /etc/ssh/sshd_config 에 위 두 줄을 직접 추가해도 됩니다.

Windows(OpenSSH 서버 호스트)C:\ProgramData\ssh\sshd_config 에 같은 두 줄을 추가하고, 관리자 PowerShell 에서 Restart-Service sshd 로 재시작합니다.

방향 참고. pytmux 가 내는 접속에는 이미 반대 방향 keepalive(내가 죽은 원격 서버를 감지)가 켜져 있습니다. 위 설정은 호스트가 죽은 접속자를 감지하는 쪽으로, 원격 서버를 여는(받는) 호스트에만 필요합니다.