원문 캡처 · github.com
원문 캡처 · github.com

mosh-rs는 Rust로 다시 만든 모바일 셸(mosh)이다. mosh 1.4와 통신 호환되며, 네이티브 Windows 클라이언트와 로컬 터미널 기록에 출력 내용을 남기는 선택형 스크롤백 기능을 제공한다. 현재 상태는 프리알파이며, 최신 프리릴리스는 v0.1.1이다.

프로젝트는 독립적으로 개발됐으며 MIT, 키스 윈스타인(Keith Winstein), mosh 관리팀과 제휴하거나 승인을 받은 프로젝트가 아니다. mosh 개발자들의 작업을 바탕으로 한다. 저장소는 mosh-rs이며, v0.1.1 릴리스에서 미리 빌드한 파일을 받을 수 있다. 프리알파 버전이므로 알려진 제한 사항에서 시험된 항목과 그렇지 않은 항목을 확인해야 한다.

mosh는 와이파이에서 셀룰러로 바뀌는 상황, 노트북이 밤새 절전 상태에 들어가는 상황, 지연 시간이 길거나 패킷 손실이 있는 연결에서도 유지되는 원격 터미널이다. UDP를 사용하고 바이트를 그대로 스트리밍하는 대신 화면 상태를 동기화한다. 서버가 응답하기 전에 키 입력을 로컬에서 화면에 반영한다. mosh-rs는 mosh 1.4.0과 통신 호환되므로 호스트에 이미 설치된 mosh-server와 함께 쓸 수 있다. 기존 프로토콜을 포크하지 않고 기능을 더하며, 새 protobuf 필드는 기존 피어가 무시하므로 구형과 신형 설치본을 섞어 쓸 수 있다.

설치와 사용 조건

Linux와 macOS에서는 클라이언트만 설치해도 기존 호스트의 mosh-server와 연결할 수 있다. 다만 --scrollback을 쓰려면 원격 호스트에도 mosh-rs의 mosh-server를 설치해야 한다. Linux 릴리스 바이너리는 정적 바이너리다. 모든 아카이브 옆에는 다운로드 확인용 .sha256 파일이 제공된다.

Linux(x86_64 또는 arm64)용 아카이브에는 mosh, mosh-client, mosh-server가 들어 있다. uname -m 결과가 x86_64 또는 aarch64인지 확인해 맞는 아카이브를 고른다.

sh
v=v0.1.1; t=$(uname -m)-unknown-linux-musl
curl -LO https://github.com/Arunjay4213/mosh-rs/releases/download/$v/mosh-rs-$v-$t.tar.gz
curl -LO https://github.com/Arunjay4213/mosh-rs/releases/download/$v/mosh-rs-$v-$t.tar.gz.sha256
sha256sum -c mosh-rs-$v-$t.tar.gz.sha256
tar xzf mosh-rs-$v-$t.tar.gz
sudo install mosh-rs-$v-$t/mosh mosh-rs-$v-$t/mosh-client mosh-rs-$v-$t/mosh-server /usr/local/bin/
mosh --version # prints "mosh-rs 0.1.1"

sudo를 쓰지 않으려면 ~/.local/bin처럼 직접 쓸 수 있고 PATH에 포함된 디렉터리에 설치하면 된다. CPU 아키텍처가 맞지 않는 아카이브를 설치하면 프로그램을 실행할 때마다 cannot execute binary file: Exec format error가 나온다.

Apple silicon이 탑재된 Mac에는 mosh-rs-v0.1.1-aarch64-apple-darwin.tar.gz를 내려받아 설치한다. 체크섬 확인에는 sha256sum -c 대신 shasum -a 256 -c를 쓴다. v0.1.0의 macOS 클라이언트는 소켓 주소에서 주소 계열을 Linux와 다른 위치에서 읽어 연결하지 못했다. v0.1.1에서 이 문제가 수정됐다. v0.1.1 아카이브로 Apple silicon Mac에서 Linux 서버에 실제 세션을 연결한 기록은 INTERVENTIONS.md에 있다. v0.1.0의 macOS mosh-server도 별도로 확인했으며, Linux 클라이언트가 해당 서버와 전체 세션을 실행했다.

Windows용 빌드는 x86_64 하나다. Windows 11에 내장된 x64 에뮬레이션을 통해 Windows on Arm에서도 실행할 수 있다. 아래의 수동 테스트도 ARM64 Windows 11 노트북에서 에뮬레이션으로 진행했다. PowerShell에서 zip 파일과 체크섬을 내려받아 비교하고 압축을 푼다.

powershell
$f = "mosh-rs-v0.1.1-x86_64-pc-windows-msvc"
Invoke-WebRequest "https://github.com/Arunjay4213/mosh-rs/releases/download/v0.1.1/$f.zip" -OutFile "$f.zip"
Invoke-WebRequest "https://github.com/Arunjay4213/mosh-rs/releases/download/v0.1.1/$f.zip.sha256" -OutFile "$f.zip.sha256"
(Get-FileHash "$f.zip" -Algorithm SHA256).Hash.ToLower() -eq (Get-Content "$f.zip.sha256").Split(" ")[0] # must print True
Expand-Archive "$f.zip" -DestinationPath .
cd $f
.\mosh.exe --version # prints "mosh-rs 0.1.1"

압축을 풀면 mosh.exe와 mosh-client.exe가 든 mosh-rs-v0.1.1-x86_64-pc-windows-msvc 폴더가 생긴다. mosh.exe는 같은 폴더에 있는 mosh-client.exe를 실행하므로 두 파일을 함께 둬야 한다. Windows Terminal에서 해당 폴더로 이동해 .\mosh.exe user@host를 실행하거나 폴더를 PATH에 추가한 뒤 mosh user@host를 실행한다.

실행기는 Windows 10 이후 버전에 포함된 OpenSSH 클라이언트를 사용한다. Windows용 서버는 없으며 원격 호스트에는 mosh-rs 또는 mosh 1.4의 mosh-server가 필요하다. Windows Terminal에서 이스케이프 키 Ctrl-^는 Ctrl+6으로 입력한다. 따라서 Ctrl+6을 누른 다음 .을 입력하면 세션을 종료한다. Windows에서 확인한 내용은 Windows 안내에 정리돼 있다.

Rust 1.89 이상에서는 Git의 v0.1.1 태그에서 Cargo로 빌드·설치할 수 있다. 패키지 이름은 mosh이며 mosh, mosh-client, mosh-server를 ~/.cargo/bin에 설치한다.

sh
cargo install --locked --git https://github.com/Arunjay4213/mosh-rs --tag v0.1.1 mosh

crates.io에 mosh라는 이름으로 배포할 준비는 진행 중이다. 그때까지는 위 Git 설치 명령을 사용해야 한다. crates.io의 mosh-rs는 무관한 별도 프로젝트이므로 cargo install mosh-rs를 실행하면 안 된다. Windows에서 설치되는 mosh-server.exe는 서버가 지원되지 않는다는 안내만 출력한다.

소스에서 빌드하려면 Linux나 macOS에서 Rust 1.89 이상을 사용한다. 이는 Cargo.toml에 적힌 최소 버전이다.

sh
git clone https://github.com/Arunjay4213/mosh-rs
cd mosh-rs
cargo build --release
# binaries: target/release/mosh, target/release/mosh-client, target/release/mosh-server

Windows 클라이언트 빌드 방법은 Windows 빌드 안내에 있다.

명령과 스크롤백

mosh-rs는 mosh와 같은 이름과 플래그를 쓰는 세 프로그램을 빌드하므로 기존 스크립트를 계속 사용할 수 있다.

sh
mosh user@host # connect; type Ctrl-^ then . to quit
mosh host -- tmux attach # run a command instead of a login shell
mosh --ssh="ssh -p 2222" host # custom ssh command
mosh -p 60001 host # pin the server's UDP port (or a range: 60000:60010)
mosh --predict=always host # local echo even on fast links
mosh --local localhost # run mosh-server locally, without ssh (a host argument is still required)
mosh --scrollback host # keep the session's output in your terminal's history (needs a mosh-rs server)

상류 mosh와 마찬가지로 이스케이프 키는 Ctrl-^다. Ctrl-^ 다음에 .을 입력하면 종료하고, Unix에서는 Ctrl-^ 다음에 Ctrl-Z를 누르면 클라이언트를 일시 중단한다. 대부분의 터미널에서는 Ctrl+6 또는 Ctrl+Shift+6으로 Ctrl-^를 입력할 수 있다. MOSH_ESCAPE_KEY로 이 키를 바꿀 수 있다.

자주 쓰는 실행기 옵션은 PLAN.md의 8절에 정리돼 있다. 전체 mosh.pl 옵션은 mosh --help에서 확인할 수 있다.

  • --server=COMMAND: 원격 호스트에서 실행할 mosh-server 명령. 기본값은 mosh-server다.
  • --ssh=COMMAND: 서버를 시작하는 데 쓸 ssh 명령. 기본값은 ssh다.
  • -p, --port=PORT[:PORT2]: 서버 쪽 UDP 포트 또는 포트 범위.
  • --predict=adaptive|always|never|experimental: 로컬 에코 모드. -a는 always, -n은 never다.
  • --no-init: 터미널 초기화 문자열을 보내지 않는다.
  • --local: ssh 없이 로컬에서 mosh-server를 실행한다.
  • -4, -6: IPv4만 또는 IPv6만 사용한다.
  • --scrollback: 세션 출력을 로컬 터미널 기록에 남긴다. mosh-rs 서버가 필요하며, 그렇지 않으면 안내 메시지를 표시하고 상류 mosh 방식으로 동작한다. mosh-rs에서 추가된 옵션이다.

서버에서는 mosh-server new --scrollback MIB로 아직 전달하지 않은 기록의 최대 용량을 지정한다. 기본값은 32 MiB이며 0으로 설정하면 기록을 끈다.

상류 버전과 같은 환경 변수도 지원한다.

  • MOSH_KEY: 실행기가 mosh-client에 전달하는 세션 키. 읽은 뒤 환경에서 제거된다.
  • MOSH_PREDICTION_DISPLAY: 기본 예측 모드. adaptive, always, never, experimental 중 하나다.
  • MOSH_ESCAPE_KEY: 클라이언트의 이스케이프 키. 기본값은 Ctrl-^다.

상류 mosh는 클라이언트가 로컬 터미널을 대체 화면(alternate screen)으로 전환하고 서버가 화면 위로 밀려난 행을 버리기 때문에 스크롤백을 제공하지 않는다. mosh --scrollback과 mosh-rs 서버를 함께 쓰면 서버가 화면 위로 밀려난 행과 프로그램이 화면을 지울 때 남아 있던 행을 기록한다. 이를 기존 피어가 무시하는 새 protobuf 필드로 보낸다. 클라이언트는 해당 행을 터미널의 일반 기록에 기록하므로 마우스 휠과 터미널 검색을 ssh를 쓸 때처럼 이용할 수 있다. vim과 less 같은 전체 화면 프로그램은 터미널 자체의 대체 화면에서 실행되므로 이들이 그리는 내용은 기록에 들어가지 않는다. 프로그램이 끝나면 이전 화면이 돌아온다.

현재 화면은 계속 최신 상태로 유지되지만, 큰 출력이 한꺼번에 발생하면 기록은 몇 초 늦게 따라올 수 있다. 예를 들어 seq 1 50000의 기록은 루프백에서 약 9초에 걸쳐 도착한다. 패킷 손실 상황에서도 동작하도록 서버가 왕복 시간마다 기록 패킷을 몇 개만 전송하기 때문이다. 기록을 보내려고 원격 프로그램을 멈추지는 않는다. 노트북이 긴 빌드 중 절전 상태에 드는 등의 이유로 대기 중인 기록이 32 MiB를 넘으면, 아직 전달하지 않은 가장 오래된 행을 버리고 몇 행을 버렸는지 흐린 글씨로 기록에 표시한다. 터미널 높이를 바꾸면 몇 행이 유실되거나 반복될 수 있다. 터미널은 크기 변경 때 화면 아래쪽을 유지하지만 mosh의 에뮬레이터는 위쪽을 유지하기 때문이다.

상류 서버에 --scrollback으로 접속하면 일반 mosh 동작으로 전환하고 mosh: Server does not support scrollback; using the alternate screen.이라는 안내를 표시한다. --scrollback을 쓰지 않으면 mosh-rs 서버를 사용해도 세션 기록은 남지 않는다.

기능을 쓰려면 Linux 또는 macOS 설치 절차에 따라 원격 호스트에 mosh-rs의 mosh-server를 설치한다. ssh host mosh-server --version을 실행했을 때 mosh-server (mosh-rs ...)가 출력되는지 확인한다. 호스트의 PATH에서 mosh-rs 서버가 첫 번째 mosh-server가 아니면 다음처럼 실행기에서 경로를 지정한다.

sh
mosh --scrollback --server=/path/to/mosh-server host

스크롤백 검사는 tests/scrollback.sh에서 수행한다. tmux 안에서 mosh로 seq 1 50000을 실행하고 200,000행 기록을 캡처해 seq 출력과 한 줄씩 비교한다. 30% 패킷 손실 상황, vim과 less 사용 전후, clear 실행 전후, 창 크기 변경, 상류 서버 접속도 검사한다.

호환성과 검증 결과

저장소의 호환성 검사는 각 화면 시나리오별로 여섯 차례 실행한다. udp-impair 프록시를 거치는 루프백 스크립트 세션의 최종 화면을 같은 스크립트를 직접 실행했을 때의 화면과 비교한다. mosh 1.4 바이너리는 Ubuntu 24.04 apt 패키지를 사용했다. 각 칸의 ✅는 INTEROP_FULL=1 tests/interop.sh로 검증됐다는 뜻이다.

클라이언트 / 서버정상 연결패킷 손실 5%손실 30%, 200ms, 순서 변경2분 단절클라이언트 이동
mosh-rs 클라이언트 / mosh-rs 서버✅✅✅✅✅
mosh-rs 클라이언트 / mosh 1.4 서버✅✅✅✅✅
mosh 1.4 클라이언트 / mosh-rs 서버✅✅✅✅✅
mosh 1.4 클라이언트 / mosh 1.4 서버(기준)✅✅✅✅✅
--scrollback을 쓰는 mosh-rs 클라이언트 / mosh-rs 서버✅✅✅✅✅
--scrollback을 쓰는 mosh-rs 클라이언트 / mosh 1.4 서버✅✅✅✅✅

검사는 각 조합에서 순번, 색상, vim, 넓은 문자, 창 크기 변경, 타이핑 등 여섯 화면 시나리오를 실행했다. arm64 Linux 가상 머신에서 커밋 728e468로 총 180회 실행했다. 앞의 네 행은 120회, --scrollback 두 행은 60회다. 결과는 STATUS.md에 기록돼 있다. 손실 열의 패킷 손실은 세션 연결 후 시작한다. 첫 패킷부터 손실률 30%인 상황에서의 연결 설정은 별도로 tests/interop-setup-loss.sh로 확인했으며, mosh-rs 클라이언트와 1.4 서버 조합 및 1.4 클라이언트와 mosh-rs 서버 조합에서 각각 40회 중 40회 성공했다.

상류 mosh의 자체 테스트도 decd9b7 트리에서 실행했다. mosh-rs 바이너리를 클라이언트, 서버 또는 양쪽에 넣은 모든 조합에서 32개 테스트 중 30개가 통과했다. 나머지 2개는 상류에서도 예상되는 실패와 같았다.

정확성 검증은 단위 테스트만으로 이뤄지지 않는다. 저장소는 상류의 C++ 코드와 비교하고, 각 검사를 실행할 수 있는 프로그램으로 만들며, 결과를 STATUS.md에 기록한다고 설명한다.

  • 상류 빌드에 연결한 소규모 C++ 하네스가 에뮬레이터 화면, new_frame 출력, 암호화 패킷을 덤프한다. Rust 구현은 바이트 단위로 같은 출력을 내야 한다.
  • 생성한 이스케이프 시퀀스 입력으로 차등 퍼징을 한다. 1,000,000회 실행 한 번과 200,000회 실행 여러 번, new_frame용 무작위 화면 쌍을 두 에뮬레이터에 넣는다. 불일치가 있으면 입력을 줄여 원인을 찾아 수정한다.
  • bash, vim, less, htop, tmux, Claude Code TUI, seq, 창 크기 변경, 256색과 트루컬러, 넓은 문자와 이모지를 포함한 기록 세션 10개 및 상류 에뮬레이션 테스트의 입력 17개를 양쪽 에뮬레이터에서 재생한다.
  • Rust와 C++ 클라이언트·서버를 모든 조합으로 연결하고 손실, 지연, 패킷 순서 변경, 단절, 클라이언트 이동을 시험한다.
  • 상류 mosh의 make check를 실행하면서 바이너리를 mosh-rs 것으로 바꿔 검사한다.
  • 실제 바이너리를 tmux에서 주로 구동하는 종단 간 검사와 비교 검사를 한다. 클라이언트, 서버, 왕복 시간 300ms에서의 예측 시점, 실행기 옵션과 메시지를 /usr/bin/mosh와 비교하는 73개 사례, 모든 터미널 유형에 대한 terminfo 응답, 악의적인 스크롤백 서버 등을 포함한다.
  • 스크롤백 기준 검사에서는 tmux 안의 mosh-rs로 실행한 seq 1 50000이 기록에 빠짐·중복·빈 줄 없이 나타나야 한다. 패킷 손실 30%, vim 사용, clear, 너비 변경도 검사한다. 높이 변경은 위에서 설명한 제한이 있다.
  • C++ mosh 1.4.0과 같은 하네스에서 나란히 벤치마크한다.

Windows 클라이언트는 콘솔을 VT 모드로 전환한다. 따라서 키 입력은 Unix 터미널과 같은 이스케이프 시퀀스 바이트로 전달되고 출력도 일반 VT 바이트가 되며, 별도의 키 변환 계층을 두지 않는다. Windows 10 이후에 포함된 ssh.exe로 서버를 시작한다. TERM이 설정되지 않았으면 Windows에서 일반적으로 쓰이는 TERM=xterm-256color를 가정한다. mosh.exe와 mosh-client.exe는 Linux에서 교차 컴파일되며 시스템 DLL만 필요하다. mosh-server는 상류와 마찬가지로 Unix에서만 동작한다.

ARM64 Windows 11 노트북에서 Windows Terminal을 사용해 x86_64 빌드를 에뮬레이션하고 Linux 서버에 연결하는 수동 테스트를 했다. 연결, 타이핑, ls --color, vim, UTF-8 출력, Ctrl-C, 창 크기 변경, 종료가 동작했고 와이파이를 껐다 켠 뒤에도 세션이 유지됐다. 이 네트워크 손실 검사는 실행 중 네트워크를 끊고 mosh가 복구한다는 점에서 절전 후 깨우기와 같은 방식으로 처리해, Windows 클라이언트의 네트워크 손실 확인을 대신했다. Windows 컴퓨터의 절전 및 복귀는 시험하지 않았다. Windows의 Ctrl-^ Ctrl-Z와 유휴 CPU 사용량도 아직 시험하지 않았다. 테스트 기록은 INTERVENTIONS.md에 있다.

성능 비교

저장소의 PLAN.md 5절에 정한 목표를 C++ mosh 1.4.0(Ubuntu 24.04 패키지)과 비교했다. 같은 Neoverse-V1 기반 8코어 arm64 Linux 가상 머신에서 mosh-rs 커밋 7cab26f와 target/release/bench --hour를 사용했다. 두 구현은 같은 스크립트 작업을 실행하며 매 실행마다 순서를 번갈아 바꿨다. 작업 내용은 tools/bench/README.md에 설명돼 있다.

지표목표mosh-rsmosh 1.4.0
60초 유휴 CPU 사용량(클라이언트, 서버)0.0%0.00%, 0.00%0.00%, 0.00%
1시간 세션 후 클라이언트 상주 메모리mosh 1.4.0 이하4.1 MiB14.3 MiB
1시간 세션 후 서버 상주 메모리mosh 1.4.0 이하2.5 MiB9.9 MiB
정적 바이너리 크기(aarch64 musl): mosh, mosh-client, mosh-server4 MB 미만0.8 MB, 1.2 MB, 1.1 MB측정하지 않음(Perl 스크립트 및 동적 링크 바이너리)
클라이언트 시작부터 첫 터미널 출력까지20ms 미만1.40ms2.94ms
시작부터 첫 프레임까지(루프백)mosh 1.4.0보다 느리지 않음252.2ms256.6ms
예측 사용 시 키 입력부터 화면 표시까지, 왕복 시간 300ms한 번 렌더링, 눈에 띄는 지연 없음0.09ms, 한 번 렌더링0.08ms, 한 번 렌더링
루프백에서 seq 1 100000이 화면에 모두 나타날 때까지mosh 1.4.0보다 느리지 않음110ms130ms

첫 프레임은 두 구현 모두 약 250ms가 걸린다. 상류의 왕복 시간 추정이 1초에서 시작해 첫 전송 간격을 최대값인 250ms로 설정하기 때문이다. mosh-rs는 상류의 시간 계산을 유지한다. 메모리 차이에는 공유 라이브러리 페이지도 일부 영향을 준다. C++ 바이너리는 공유 라이브러리 여러 개를 불러오지만 정적 mosh-rs 바이너리는 불러오지 않는다. 여러 차례 실행한 항목의 수치는 중앙값이며, 전체 출력에는 p90 값과 실행별 시간도 포함된다.

구현과 프로젝트 상태

mosh 세션은 네 계층으로 구성되며 mosh-rs는 각 계층을 상류에서 포팅했다.

  • 암호화: UDP 패킷은 16바이트 태그를 사용하는 AES-128 OCB3로 암호화한다. 키는 서버가 ssh를 통해 한 번 출력하는 비밀값이다.
  • 전송(SSP): 양쪽은 상태 객체의 번호가 붙은 스냅샷을 보관하고, 상대가 마지막으로 확인한 스냅샷과의 차이만 보낸다. 패킷을 잃으면 같은 패킷을 재전송하는 대신 더 최신 차이를 보낸다. 서버는 새 주소에서 온 첫 유효 패킷을 받으면 클라이언트의 새 주소를 받아들여 이동을 지원한다.
  • 상태 객체: 클라이언트는 키 입력과 창 크기 변경을 보내고, 서버는 클라이언트 화면을 다시 그리는 이스케이프 시퀀스로 터미널 화면을 보낸다.
  • 프런트엔드: mosh가 ssh로 mosh-server를 시작한다. 서버는 의사 터미널에서 셸을 실행하고, mosh-client는 미러링한 화면과 예측된 로컬 에코를 그린다.

전체 설계는 docs/ARCHITECTURE.md에 있다.

포팅은 AI 코딩 에이전트가 상류 mosh 소스를 바탕으로 작성된 계획인 PLAN.md에 따라 수행했다. 프로젝트 설명에 따르면 각 모듈은 앞서 설명한 차등 검사로 상류 코드와 대조했고, 포팅한 원본 코드와 줄 단위로 검토했다. 작업 기록은 저장소에서 확인할 수 있다.

  • PLAN.md: 포팅 계획과 상류와 다르게 허용한 사항(9절).
  • STATUS.md: 실행한 명령과 측정 결과를 포함한 상태 기록.
  • INTERVENTIONS.md: 외부 도움이 필요했거나 계획에서 벗어난 모든 시점의 기록.
  • reviews/: 코드 리뷰와 각 지적의 해결 방법.

프로젝트의 주요 디렉터리는 다음과 같다.

  • crates/terminal: VT 파서, 프레임버퍼, Display, new_frame을 담당한다. 입출력 없는 순수 Rust 구현이며 상류의 src/terminal에서 포팅했다.
  • crates/network: OCB3 암호화, protobuf 메시지, SSP 전송을 담당한다. 상류의 src/crypto, src/network, src/protobufs에서 포팅했다.
  • crates/platform: 로컬 tty, 의사 터미널, 프로세스 실행, UDP 소켓, 선택 루프를 담당한다. 플랫폼별 코드가 있는 유일한 크레이트이며 상류의 src/util, src/frontend, src/network의 소켓 부분에서 포팅했다.
  • crates/mosh: 상태 동기화, 클라이언트, 예측 오버레이, 서버, 실행기를 담당하며 mosh, mosh-client, mosh-server를 만든다. 상류의 src/statesync, src/frontend, scripts/mosh.pl에서 포팅했다.
  • ref/: 상류 빌드에 연결한 C++ 기준 하네스이며 배포물에는 포함되지 않는다.
  • tools/: udp-impair, 코퍼스 기록기, 벤치마크 도구를 담으며 배포물에는 포함되지 않는다.
  • tests/: 종단 간 테스트와 적합성 테스트를 담는다. tests/run-all.sh로 모두 실행한다.
  • scripts/: 기준 하네스용 상류 빌드, 정적 릴리스 빌드, CI 도우미를 담는다.

기여는 환영하지만, PLAN.md 9절에 적힌 차이를 제외하면 상류 mosh master(decd9b7, 2026년 3월)와 동작이 정확히 같아야 한다. 풀 리퀘스트를 열기 전 CONTRIBUTING.md를 읽고, 토론에 참여하기 전 행동 강령을 확인해야 한다. 보안 취약점은 공개 이슈로 신고하지 말고 SECURITY.md의 비공개 신고 절차를 따라야 한다. 버그나 mosh와 다르게 동작하는 부분은 이슈로 보고할 수 있다.

mosh-rs는 mosh가 GPLv3인 데 따라 GNU General Public License v3.0 이상으로 배포된다. mosh는 키스 윈스타인과 mosh 저자들이 만들었다. mosh-rs가 기준으로 삼은 프로토콜, 에뮬레이터 설계, 예측 오버레이, 테스트 스위트는 이들의 작업이다. 관련 자료는 mosh.org, 상류 저장소 mobile-shell/mosh, 논문 “Mosh: An Interactive Remote Shell for Mobile Clients”(윈스타인과 발라크리슈난, USENIX ATC 2012)에서 볼 수 있다. 프로젝트는 MIT, 윈스타인, mosh 관리팀과 제휴하거나 이들의 보증을 받은 것이 아니다. mosh-rs의 버그는 상류가 아니라 mosh-rs 저장소에 보고해야 한다.

부록: 원문 예시

원문에 실린 예시 1

text
), six screen scenarios per cell (seq, colors, vim, wide characters, resize, typing), 180 runs in all (120 for the first four rows, 60 for the two