원격 페더레이션 (ssh)
ssh 너머 다른 머신의 pytmux 서버 탭을 지금 화면에 끌어와, 로컬 탭과 원격 탭을 한 창에서 섞이지 않게 함께 씁니다.
붙이기 · 분홍 탭
remote-attach <host> 로 ssh 너머 다른 머신의 pytmux 서버에 붙습니다. 원격 탭은
탭바·외곽선을 분홍색으로 구분하며, 로컬 탭과 섞이지 않습니다. 원격 서버가 없으면
분리 서버를 자동 기동합니다(PYTMUX_NO_REMOTE_AUTOSTART=1 로 opt-out). 전송은
ssh -T 이며, 접속 대상·인증은 사용자의 ssh 설정(~/.ssh/config·
known_hosts·키)을 그대로 따릅니다.
원격 탭 다루기
| 명령 | 동작 |
|---|---|
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, 기본 on — nest-auto-attach off 로 끄면 거부).
중간 상자를 거쳐 붙기 (다중홉, via)
내 컴퓨터에서 목적지로 ssh 가 곧바로 되지 않고 징검다리 서버를 거쳐야 하는 구성
(사내망 안쪽 등)에서는 remote-attach <C> via <B> 로 B 를 거쳐 C 에 붙습니다.
붙은 뒤 동작은 1홉과 같습니다 — 탭은 분홍색으로 구분되고, 화면·입력·이름 바꾸기·토큰 회계가 모두 그대로 흐릅니다.
탭 이름은 ⇄B>C:이름 이고, 떼어낼 때의 인자도 같은 B>C 입니다
(remote-detach B>C).
중계는 B 에서 도는 pytmux relay-proxy <C> 가 맡습니다. 그래서
B 에도 pytmux 가 설치돼 있어야 하고, B→C 의 접속·인증은 B 의 ssh 설정
(~/.ssh/config·known_hosts·키)을 따릅니다. 겹쳐 쓴 ssh 명령 문자열이 아니라
고정된 인자로 부르기 때문에 B 의 셸이 해석할 것이 없고, 중계 상자가 자기
허용 목록(opts.json 의 remote_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 을 보내도 마찬가지입니다.
기본값은 종전과 같은 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 — 호스트에서 드롭인 한 파일(관리자 권한):
약 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 로 재시작합니다.