---
title: "リモート"
description: "SSH ホスト帳、SSH / Mosh / ThinkTerm Connect による接続、Tailscale アプリなしで tailnet に参加する方法、保存パスワードの暗号化、そして切断・アップグレード・デバイス間の移動をまたいでセッションが生き残る仕組み。"
url: "https://docs.closex.org/ja/thinkterm/remote.html"
markdown_url: "https://docs.closex.org/ja/thinkterm/remote.md"
site: "CloseX Docs"
product: "ThinkTerm"
language: "ja"
last_updated: "2026-11-08T12:04:16.000Z"
alternates:
  en: "https://docs.closex.org/thinkterm/remote.md"
  zh-Hans: "https://docs.closex.org/zh/thinkterm/remote.md"
  ja: "https://docs.closex.org/ja/thinkterm/remote.md"
---

# リモート

> **ドキュメント作成中**
> 一部の内容はまだ不完全な場合があります。

ThinkTerm のリモートワークスペースは、ローカルと同じ感触で使えることを目指しています。セッションを保持するのは目の前のウィンドウではなくマルチプレクササーバーなので、ノート PC を閉じても、別のマシンへ移っても、ネットワークが切れても、作業が終わることはありません。同じマルチプレクササーバーはローカルの端末も保持できるため、以下の内容の多くはネットワーク越しのマシンだけの話ではありません。

![Space ごとにまとまったライブターミナル（現在オフラインのマシンを含む）](https://docs.closex.org/img/thinkterm/thinkterm_tab_overview.webp)

## SSH ホスト帳

ThinkTerm は独自のホスト一覧を、システムの SSH 設定とは別に保持します。その隣に、`~/.ssh/config` で定義されたホストが読み取り専用のビューとして表示されます — ThinkTerm はこのファイルを読みますが、書き込むことはありません。

ThinkTerm 自身の一覧では、ホストごとにユーザー名、鍵ファイル、任意の SSH オプション、既定のワークスペース、そして保存パスワードを記録できます。OS 判定は既定で有効になっており、接続したホストがどのディストリビューションで動いているかを報告できます。

### リモートホストのページ {#the-remote-hosts-page}

一覧は `リモートホスト` のページにあり、サイドバー下端のボタンか `Remote Hosts...` コマンドで開きます。Space メニューの `リモートホストを追加…` は、空のホストを開いた状態でこのページを開きます。検索欄が空のあいだは、先頭のカードが ThinkTerm Connect を説明し、`サーバーを追加` ボタンがあります。自分のホストが `ホスト` の下に先に並びます。続いて `Tailscale` グループに tailnet のマシンが並び（[内蔵 tailnet](#the-built-in-tailnet) を参照）、その後に `~/.ssh/config` のホストが `SSH 設定から（n）` のグループにまとまります。このグループは折りたためて、検索中は自動的に開きます。検索欄はホストの名前、アドレス、ユーザーに一致します。

各カードには名前の下に接続先が示されます。ThinkTerm Connect のホストはサーバーの姿で青く描かれ、アドレスだけが書かれます。それ以外のカードには接続方法 — `SSH` または `Mosh` — も書かれ、Connect へ向かうボタンが付きます。自分のホストには `Connect に切り替え`（その場で切り替わります）、`~/.ssh/config` のホストには `Connect で追加`（そこから内容を入れた新しいホストを開きます）です。

自分のホストを選ぶと、一覧の隣のエディターで開きます。エディターの左端をドラッグすると幅を変えられ、幅は記憶されます。グループは上から次の順です。

| グループ | 項目 |
|---|---|
| `接続` | `名前`、`アイコン`、`ネットワーク`、`ホスト`、`ポート`（新しいホストでは 22）、`その他のアドレス`、`ユーザー` |
| `接続方法` | 3 枚のカードから 1 つ選びます: `ThinkTerm Connect`、`SSH`、`Mosh` |
| `認証` | `パスワード`、`Identity ファイル` |
| `セッション` | `ワークスペース`、`OS を検出`、`ファイルパネルを自動で接続`、通常の SSH でのみ表示される `リモートのプログラムを識別`、Mosh を選んだときの `Mosh サーバーコマンド` |
| `詳細設定` | そのほかの SSH オプション。`+ オプションを追加` で 1 つずつ加える |

`アイコン` は、そのホストを Space メニューでどう描くかを決めます。`サーバ`（既定。ふつうのサーバーのアイコンです）、`クラウド`、`地球`、`ノートパソコン`、`Mac mini`、`デスクトップ`、`シングルボードコンピュータ`、`コンテナ` から選びます。

新しいホストは `ThinkTerm Connect`（`おすすめ` の印付き）で始まり、`OS を検出`、`ファイルパネルを自動で接続`、`リモートのプログラムを識別` がオンです。`ファイルパネルを自動で接続` は、この項目ができる前に保存したホストではオフです。オンにすると、ファイルパネルは、そのホストのターミナルが隣にある時点で、`接続` を待たずに接続します — [SFTP 経由のリモートファイル](https://docs.closex.org/ja/thinkterm/files-and-notes.md#remote-files-over-sftp)を参照してください。

`ネットワーク` は `システム` か `内蔵 Tailnet` です。[内蔵 tailnet](#the-built-in-tailnet) を参照してください。`その他のアドレス` には、そのホストが応答するほかの場所 — LAN 内の名前、Tailscale の名前、ポート転送した公開アドレス — をカンマか空白で区切って並べます。それぞれ `ホスト` か `ホスト:ポート` の形で、ポートを省くと `ポート` が使われます。接続は `ホスト` から始め、続いてほかのアドレスを 0.3 秒ずつずらして試します。前のものが失敗したら、すぐ次を試します。最初に応答したものが接続を担い、ThinkTerm はその接続でサインインを 1 回だけ行います。ホスト鍵はどのアドレスが応答しても `ホスト` に対して照合され、記録にある鍵と違う鍵を示すアドレスは、別のマシンとして飛ばされます。つながったアドレスは、以後 1 時間、次の接続で最初に試されます。

保存済みのホストでは、`ネットワーク`、`アイコン`、`接続方法` の選択、3 つのスイッチ（`OS を検出`、`ファイルパネルを自動で接続`、`リモートのプログラムを識別`）は、クリックした時点で保存されます。入力した内容は `保存` を待ち、`キャンセル` しても、行った選択は残ります。保存済みのホストのエディター上部には `接続` があり、新しいホストには `保存` と `保存して開く`（保存してから接続）があります。ホストはネットワーク、アドレス、ユーザー、ポートで識別されるため、この 4 つがまったく同じ 2 つ目のホストは拒否され、既存のホストを編集するよう案内されます。すでに保存されているホストと同じになるネットワークへの切り替えも同様です。

カードのメニューには `接続`、`ホストを編集…`、`複製`、`「名前」を削除` があります。`複製` は元のホストの内容 — パスワードとオプションも含めて — を入れた新しいホストを開きますが、アドレスだけは異なる必要があるので写しません。名前は元の名前に `copy` を付けたものです。削除には `完全に削除` でもう一度クリックが要ります。ホストのスレッドと、そこからミラーされた Space も一緒に削除されるからです。これらの Space はこのデバイスから取り除かれるだけで、サーバーには残り、ホストを追加し直せば戻ってきます。`~/.ssh/config` のホストには ThinkTerm のものとして編集や削除できるものがないので、メニューには `接続` しかありません。

ThinkTerm Connect のホストの名前を変えたり、別のネットワークへ移したりしても、その Space は失われません。Space はホストの新しい名前に付いていきます。古い接続がまだ生きているあいだは、それが終わるまで古い名前の側に残ります。

## 3 つの接続方法

ホストは次のいずれかの方法で開けます。エディターの `接続方法` で選びます。

**通常の SSH** — 直接のセッションです。接続が切れればセッションも終わります。

**Mosh** — ネットワークの切り替えやスリープに耐えるローミング型の UDP セッションです。ThinkTerm は既定で `mosh-server new -s -l LANG=en_US.UTF-8` によりリモート側を起動します。このコマンドはホストごとに変更でき、リモートマシン上の `mosh-server` が通常と異なる場所にある場合に必要になります。

**ThinkTerm Connect** — 常駐するマルチプレクサで、新しいホストの初期値です。完全なワークスペースが得られるのはこの方法だけです。サーバーがセッションツリーを保持するため、複数のクライアントが同時に接続して同じ構造を見ることができ、あるクライアントが離脱してもすべてはそのまま動き続けます。

## ホストに必要なもの

**通常の SSH** には SSH サーバーがあれば十分です。

**Mosh** には両端に Mosh が必要で、ThinkTerm はどちらも同梱していません。ThinkTerm は SSH でログインし、ホストの `Mosh サーバーコマンド` で `mosh-server` を起動してから、サーバーの応答をもとにこのマシンで `mosh-client` を実行します。自分ではそれができないとき — 保存したパスワードがない、ホスト鍵の確認が要る、コマンドが失敗した — は、端末で `mosh` コマンドを実行する方法に切り替え、問われたことにあなたが答えられるようにします。この代替手段が引き継ぐのはホストのポートと鍵ファイルだけで、ほかの SSH オプションや保存したパスワードは渡りません。いずれにしても、ホストには `mosh-server` が、このマシンには Mosh のクライアントが入っている必要があります。

**ThinkTerm Connect** には、ホストに ThinkTerm が必要です。サーバー版で足り、root も要りません。

```bash
curl -fsSL https://raw.githubusercontent.com/RoversX/thinkterm/main/install.sh | sh -s -- --server
```

サービスの設定は要りません。接続するとホストで `thinkterm cli --prefer-mux proxy` が実行され — まず `~/.local/bin` のもの、次に `PATH` 上の `thinkterm` が使われます — サーバーがまだ動いていなければ、それが `thinkterm-mux-server --daemonize` を起動します。誰かが接続する前に、同じコマンドで自分で起動しておくこともできます。

ThinkTerm がまだ入っていないホストも行き止まりではありません。接続時にまず `~/.local/bin/thinkterm` を探し、次に `PATH` 上の `thinkterm` か `wezterm` を探します。どれも見つからなければ、接続ウィンドウがその旨を表示して `Install it? [y/N]` と尋ねます（この表示は翻訳されず、英語のままです）。質問には、このバージョンを ssh のユーザーとして、root なしで、ホストの `~/.local` の下に入れること、インストールスクリプトとそのリリースのチェックサムが SSH で送られ、アーカイブはホスト自身がダウンロードすることが書かれています。[リモートサーバーを更新する](https://docs.closex.org/ja/thinkterm/updates.md#updating-a-remote-server) と同じです。答えるまでは GitHub には何も問い合わせません。`y` と答えるとインストールしてから接続します。それ以外なら、自分で実行できるようコマンドを表示し、リモートホストのページから接続していた場合は、今回に限りそのホストを通常の SSH で開きます。ホストは Connect のホストのままで、次の接続でもまた尋ねられます。何もインストールできないときは、理由が表示されます。このアプリが開発ビルドである（この場合は尋ねません）、あるいは同意したあとで、GitHub がそのバージョンのリリースを返せない、またはホストがリリースを受け付けられない（x86-64 と ARM64 以外の CPU の Linux、musl libc、2.31 より古い glibc）場合です。

Linux のホストでは、SSH からログアウトしたあとも、サーバーはたいてい動き続けます。セッションが残したプロセスをシステムがどう扱う設定になっているか次第で、最後のセッションからのログアウトがサーバーも一緒に終わらせることもあります。そうなったときは `loginctl enable-linger $USER` で動かし続けられます。インストーラーはこれを必須の手順ではなく代わりの手段として表示します。システムによっては、管理者しか実行できないからです。

両端は同じバージョンで動いている必要があります。違う場合は ThinkTerm がこちら側から直すことを提案します。[リモートサーバーを更新する](https://docs.closex.org/ja/thinkterm/updates.md#updating-a-remote-server) を参照してください。サーバー版について詳しくは [インストール](https://docs.closex.org/ja/thinkterm/install.md) にあります。

## 内蔵 tailnet {#the-built-in-tailnet}

ThinkTerm は Tailscale アプリなしで、自分で Tailscale のネットワークに参加できます。参加すると tailnet のマシンがリモートホストに並び、`内蔵 Tailnet` に設定したホストはそれを通して接続します。macOS と Linux で使えます。それ以外では `Tailscale` グループは表示されず、`ネットワーク` には、このシステムでは内蔵 Tailnet を使用できないと表示されます。

**オンにする。** オフのあいだ、`Tailscale` グループには `tailnet のマシンに接続` というカードがあり、`オンにする` ボタンが付いています。押すとホストのエディターの代わりに Tailscale パネルが開きます。グループ見出しの右端の歯車からはいつでも開けますし、設定で Tailscale を検索すると見つかる `Tailscale → リモートホスト` からも開けます。見出しには今の状態が `オフ`、`接続中…`、`ログインが必要`、`接続済み`、`未接続`、`別のプロセスが使用中` のいずれかで表示されます。

**ログインする。** 初めて参加するコンピュータは `ログインが必要` と表示されます。`ログイン` を押すと承認用のリンクがブラウザで開き、このコンピュータが tailnet に加わります。パネルの `ログイン` グループには、別のデバイスで承認するための `ログインリンクを開く` と `リンクをコピー`、そして tailnet で作ったキーを使う `認証キー（ブラウザの代わりに）` もあります。

| パネル | 項目 |
|---|---|
| ヘッダー | tailnet をオン・オフするスイッチ |
| `状態` | `接続済み · 名前 · アドレス`、またはつながらない理由 |
| `ログイン` | 承認待ちのリンクと、`認証キー（ブラウザの代わりに）` |
| `接続` | `コントロールサーバー`（空欄なら Tailscale 本家、Headscale なら HTTPS の URL）と `tailnet での名前`（空欄なら `thinkterm-` にマシンの鍵の 4 文字を付けたもの） |
| `ログアウト` | tailnet から抜け、このコンピュータの ID と認証キーを消去します。消すものがあるときだけ表示されます |

各項目は、そこから離れたときに保存されます。コントロールサーバーや名前を変えるとノードが再起動し、tailnet を通っている接続は終わります。スイッチをオフにすると tailnet から抜けますが、コンピュータの ID は残るので、またオンにすれば同じマシンです。`ログアウト` のあとの参加は新しいマシンとして扱われ、古いほうは tailnet 側で削除するまで一覧に残ります。

**マシン。** オンラインのものが先に、続いて名前順に並びます。カードにはデバイスのアイコン（メーカーのマークか、Linux ならディストリビューションのロゴ）、名前、そしてそれが何で、オンラインかどうか（`Mac · オンライン` のように）が示されます。ホストとして保存済みのマシンをクリックすると、ほかのカードと同じようにそのホストが選ばれてエディターが開き、ダブルクリックで接続します。保存していないマシンをクリックすると、名前とアドレスを入れた新しいホストのエディターが、`ネットワーク` を `内蔵 Tailnet` にして開き、カーソルは `ユーザー` に置かれます。`保存` すれば、ほかと同じホストになります。保存済みのホストは、そのアドレス（または `その他のアドレス` のどれか）がマシンの名前、tailnet 上のフルネーム、または tailnet のアドレスと一致すると、そのマシンを表します。

**ホストを tailnet に置く。** `ネットワーク` で `内蔵 Tailnet` を選びます。Tailscale がオンになるまでは、理由を添えてグレーアウトされています。すでに tailnet にあるホストでは、そのまま表示されます。選ぶと、ホストのすべてのアドレス — `ホスト` と `その他のアドレス` — が tailnet を通して接続され、失敗してもシステムのネットワークには回りません。名前は tailnet のマシン一覧だけで引かれ、DNS は使われないので、マシンの名前、フルネーム、tailnet のアドレスのいずれかを使ってください。Mosh はシステムのネットワークを使うため、Mosh のホストを tailnet に置くことも、tailnet のホストを Mosh にすることもできません。`詳細設定` に `ProxyCommand` や `BindAddress` があるホストも使えません。同じアドレスでも、ネットワークが違えば別々の 2 つのホストです。

**動く場所。** ノードは `thinkterm-tailnet` という独立したプログラムとして動きます。tailnet がオンのあいだ、そのマシンのセッションサーバーが起動し、止まれば起動し直します。サーバーが終わるか、tailnet をオフにすると、これも終わります。オンにしたときセッションサーバーが動いていなければ、ThinkTerm がそのためだけに、端末の入っていないサーバーを起動します。`ローカル端末をバックグラウンドのセッションサーバーに置く` の設定には関係なく起動し、セッションサーバーを停止するとノードも止まります。ノードを持てるプロセスは一度に 1 つで、マシン上のどの ThinkTerm プロセスもそれを通して tailnet に届きます。`別のプロセスが使用中` は、このコンピュータの別の ThinkTerm プロセスがノードを持っているという意味です。

### 誰も座っていないマシン

`thinkterm tailnet` なら、同じことをシェルから行えます。ノードを持つセッションサーバーを動かしているユーザーとして実行してください。`sudo` は使えません。

| コマンド | すること |
|---|---|
| `thinkterm tailnet up` | 参加して、つながるまで待ちます。承認が必要ならリンクを表示します。オプション: `--serve-ssh`、`--control-url URL`、`--hostname NAME`、そしてブラウザで承認する代わりに標準入力から認証キーを読む `--auth-key-stdin` |
| `thinkterm tailnet down` | tailnet から抜けます。ID は次の `up` のために残ります |
| `thinkterm tailnet logout` | 抜けて、ID と認証キーを消去します |
| `thinkterm tailnet status` | 設定、ノードの状態、見えているマシンを表示します |

`--serve-ssh` を付けると、tailnet のマシンからこのマシンへ SSH できます。ノードは tailnet 上のこのマシンのアドレスのポート 22 をこのマシン自身の sshd に渡し、tailnet からはそれ以外を受け付けません。sshd からはそれらの接続が `127.0.0.1` か `::1` から来たように見えるので、ローカル接続向けに決めたルールがそのまま適用されます。これをオンにするのは `up --serve-ssh` だけです。付けない `up` はオフに戻し、`down` と `logout` もオフにし、パネルのスイッチがオンにすることはありません。オンのあいだ、パネルには `tailnet のマシンからこのマシンへ SSH できます（thinkterm tailnet up）。` と表示されます。

### 保存されるもの

設定はホスト帳の隣の `tailnet.json` にあります。その中の認証キーとノードの鍵は、保存パスワードと同じ `secret.key` で暗号化されているので、[同じ限界](#saved-passwords)が当てはまります。マシン上のほかの ThinkTerm プロセスは、設定の隣にあるソケット `tailnet.sock` を通してノードに届きます。このソケットを開けるのはあなたのアカウントだけです。参加の際は、Tailscale のコントロールサーバー、または `コントロールサーバー` に設定したサーバーと通信します。

## 保存したパスワード {#saved-passwords}

ホスト帳に保存したパスワードは AES-256-GCM で暗号化して保存されます。鍵は `secret.key` という別のファイルに、ホスト帳と同じディレクトリへ置かれます。

macOS と Linux では、この鍵ファイルはモード `0600` で作成されるため、そのマシンの他のアカウントからは読めません。

ただし、これが何を守らないかは明確にしておくべきです。このモードが止めるのは**他のユーザー**であって、あなた自身として動くものではありません。ファイル同期、バックアップ処理、あるいはあなたが起動した任意のプログラムは、`0600` のファイルを難なく読み取ります。しかも `secret.key` は暗号化されたホスト帳と同じディレクトリにあるため、そのディレクトリをコピーするものは両方を持ち去り、あとから落ち着いて復号できます。鍵をシステムキーチェーンではなくディスクに置くのは意図的なトレードオフであり、これがその代償です。

> **Windows にこれに相当する権限はありません**
> Windows では、鍵とホスト帳は `%LOCALAPPDATA%\ThinkTerm\ssh\` に一緒に置かれ、ほかのワークスペースデータとは分かれています。これは意図して移動プロファイルの外に出したもので、ドメインからサインアウトしたときに資格情報がプロファイルサーバーへ運ばれないようにするためです。古いインストールにある 2 つのファイルは、ThinkTerm が最初に必要としたときに対で移され、片方だけが移ることはありません。
>
> ただしファイル自体には、そこでも独自の権限は付きません — 置かれたディレクトリの ACL を引き継ぎます。そのマシンを複数のアカウントで共有している場合は、保存したパスワードは「そのフォルダーに到達できる人なら誰でも読める」ものとして扱ってください。

パスワードを保存したくない場合は、代わりに鍵ファイルを使ってください — 同じ編集画面にある、ホストごとの項目です。

## 切断は削除ではありません

リモートの Space をサイドバーから外すことと削除することは別の操作で、ThinkTerm は意図的に分けています。リモートの Space のメニューには、その名前の下に最大 3 つの項目があります。

| 項目 | すること |
|---|---|
| `切断（サーバーは実行を継続）` | このデバイスにある Space の写しを外します。サーバーは動き続け、その中のセッションはすべて生きたまま残ります。このデバイスが次に接続すると Space は戻ってきます |
| `サーバー上で削除（全デバイス）` | サーバー上の Space を削除し、すべてのデバイスから消します |
| `削除してリモートセッションを終了` | サーバー上で削除し、その中で動いているセッションも終了します。サーバーに接続しているときだけ表示されます |

ノート PC を閉じるだけなら、どれも要りません。サーバーはそのまま動き続け、次の接続で中断したところから続けられます。

予期しないネットワーク切断のあと、ThinkTerm は自動的に再接続してセッションを復元します。再試行中は失敗ではなく「接続中」として表示されます。

切れたサーバーが自動で再試行されているあいだ、サイドバーにはそのサーバー用の `再接続` が出ます。押すと待ち時間を切り上げてすぐに試し、その時点から数え直す新しい一巡になります。ログインの途中でサーバーが応答しなくなった場合は、sshd 自身が許す猶予と同じ 120 秒で見切ります。そのため、半分死んだ接続は失敗して再試行され、再接続が止まったままになることはありません。

ただし自動再試行には上限があります。約 2 分で ThinkTerm は再試行をやめ、あなたが「再接続」を押すのを待ちます。この時計が測るのは、ネットワークが落ちていた長さではなく、ワークスペースが使えない状態だった長さです — 接続自体は戻るのに、復元されたセッションが毎回拒まれるような回線も、同じ上限に達します。これを 0 に戻すのは、本当に戻ってきたセッションだけです。実際に戻って使えていたセッション — あるいは単にその 2 分より長く続いたセッション — は、次に切れたとき古い時計を引き継がず、新しく計り直します。あきらめても何も破棄されません — ドメインは接続されたままで、ウィンドウもペインもすべて残ります — が、それより長い障害からの復帰には手動の操作が 1 つ必要です。ローカルのセッションサーバーは例外で、あきらめられることはありません。

## アップグレードを越えて生き残る

以前はサーバーの更新といえば停止することであり、サーバーを停止すればそれが保持するセッションはすべて終わりました。今はそれだけではありません。

実行中のサーバーは、自分のペインを新しいバイナリへ直接引き渡せます。新しいプロセスが疑似端末、そこで動くプロセス、端末の内容、ウィンドウとタブの構造を引き取り、同じソケットで応答を始めます。クライアント側に見えるのは一度の再接続と id による再バインドだけで、ペインの中身は再起動しません。

引き継がれないペインが 2 種類あります。すでにプロセスが終了しているものと、それ自体が別の場所への通路になっているもの——独立したドメインとして開いた `ssh` や `tmux` のペインです。これらは移送されず取り除かれます。

実行中のサーバーがペインを引き渡すのは、自分より古くないビルドだけです。このルールがなければ、サーバーの更新で取り残されたアプリ — たとえば、ディストリビューションのパッケージの隣に、より新しいものが `~/.local` に入っている場合 — が起動のたびに自分のサーバーを立ち上げ、ほかのクライアントがすでに先へ進んだビルドにペインを戻してしまいます。そのアプリは代わりに自分の端末で動き、その旨を伝えます。開発ビルドはこのルールの対象外です。

これが `リモートサーバー更新時にセッションを維持` の背後にある仕組みです。流れの残りは [アップデート](https://docs.closex.org/ja/thinkterm/updates.md) を参照してください。

## ローカルセッションをセッションサーバーに置く {#local-sessions-in-a-session-server}
マルチプレクサはリモートホスト専用ではありません。`設定 › 一般 › セッションサーバー` にこの項目があります。

**`ローカル端末をバックグラウンドのセッションサーバーに置く`** —— *ローカル端末はこのマシンの mux サーバーで動作し、ThinkTerm の終了・クラッシュ・更新後も残ります。次回起動時に有効になります。*

有効にすると、ThinkTerm を終了することがローカルの作業を終わらせる操作ではなくなり、Thread のレイアウトも作り直されずに引き継がれます。新規インストールでは既定でオンです。これが既定になる前から設定を持っていたインストールはその設定を引き継ぎ、自分でオンにするまではオフのままです。切り替えは即時ではなく次回起動時に反映されます。

Windows でも使えます。macOS や Linux と同じく、新しいビルドのサーバーが実行中のサーバーからペインを引き取るので、ローカル端末は ThinkTerm の終了やクラッシュだけでなく、アップデートも越えて残ります。

ローカル端末がブラウザから届くようになる前提でもあります。ブラウザのクライアントに応じるのは mux サーバーであって、GUI 内蔵のマルチプレクサではありません。[ウェブアクセス](https://docs.closex.org/ja/thinkterm/web.md) を参照してください。ブラウザのページに、このサーバーを通してほかのマシンを開くことを許可することもでき、その場合はサーバーが SSH でそのマシンにサインインします。[ほかのマシンに接続する](https://docs.closex.org/ja/thinkterm/web.md#reaching-other-machines)を参照してください。

サーバーを経由する負担は思うほど大きくありません。サーバーは、クライアントが同じマシンにいるかどうかを知っているからです。macOS と Linux では、ソケットの向こう側のプロセスを見分け、そのクライアントにはデータを圧縮せず、より大きなバッファで送ります。ローカルのペインで大きな画像や速いアニメーションを表示しても、描画そのものよりはるかに重い負担が 2 つのプロセスにかからないのはこのためです。

### 意図して終わらせる

このサーバーはアプリより長く生きるため、意図して終わらせる手段が用意されています。`thinkterm cli stop-server`、`Quit and Stop Session Server` コマンド — macOS の ThinkTerm メニューで Quit の隣にあり、コマンドパレットにもあります。この名前は画面上で翻訳されません — そして `設定 › 一般 › セッションサーバー` の `セッションサーバーを停止` です。この行はサーバーが動いているときだけ現れ、実行するにはもう一度押す必要があります。3 つとも同じことをします — サーバー内のすべての端末が終わり、そのウィンドウは閉じ、次に開く端末は新しいサーバーで始まります。

## 複数のデバイスを行き来する {#moving-between-devices}

1 つの ThinkTerm Connect サーバーには複数のクライアントが同時に接続できます。フロントエンドを駆動するのは一度に 1 台で、その権利——ハンドオフリースは、プロセスではなくデバイスに属します。ホストとユーザーで識別される 1 つの画面です。

この区別があるおかげで再起動の代償が小さくなります。駆動していたデバイスが切断して戻ってきたとき（GUI を再起動した、ノート PC の SSH がつなぎ直された）、順番待ちの 2 つ目の画面としては扱われません。最初の描画でリースを取り戻し、クリックは要りません。

ほかのデバイスは従来どおり明示的に引き取る必要があります — ただし、意図して接続すること自体がその行為です。「接続」を押したとき、あるいはサーバーがまだ接続されていない Space へ切り替えたとき、リースは開く処理の一部として取得されます。最初の描画からその端末に打ち込める、ということです。背景で起きる再接続はそうしませんし、接続したままのレンダラーがリースを継承することもありません。どこかのデバイスが取得したあとは、以前の持ち主が戻ってきても取り返しません。手で引き取りたい場合は `remote_mux_auto_claim_on_open` で自動の側を切れます。

ほかのデバイスが駆動している端末は、あなたから隠されるわけではありません。そのデバイスに見えているとおりに描かれ、隅にはどのマシンが持っているか、クリックかスクロールで引き取れることが示されます。そうするまでは、キー入力もドラッグも分割線の操作も、見えない場所に届くのではなく、どこにも届きません。

ここではブラウザも 1 台のデバイスとして数え、ホストとユーザーではなく、入室に使ったリンクの名前で識別されます — 同じリンクで開いた 2 つのタブは 1 回の順番を共有し、`thinkterm cli list-clients` にもその名前で並びます。

ここまでの説明は、サーバーの既定のモード `B · Handoff (exclusive)` についてのものです。端末の右クリックメニューにある `Frontend access` で `A · Shared (tmux-like)` に切り替えると、順番はなくなり、接続しているすべてのデバイスが tmux のように、すべての端末へ同時に入力できます。このモードは 1 つの端末や 1 台のデバイスではなくサーバーのものなので、切り替えると接続している全員に及びます。デスクトップ版のこのメニューは翻訳されず、英語で表示されます。

## 向こう側で何が動いているか

タブには、ペインで動いているプログラムの[アイコン](https://docs.closex.org/ja/thinkterm/window.md#tab-icons)を表示できます。ThinkTerm Connect のホストでは、サーバーが自分のペインを見ていて、接続しているすべてのクライアントにそれぞれ何が動いているかを伝えるので、リモートのタブもローカルと同じように表示されます。

通常の SSH では、ThinkTerm から向こう側のプロセスは見えません — ローカルで動いているのは `ssh` だけです — そのため、リモートのシェルが自分で何を実行しているかを報告しない限り、タブが示せるのはそこまでです。ThinkTerm 自身の一覧にある各ホストには、そのための `リモートのプログラムを識別` スイッチがあります。新しいホストではオン、このスイッチができる前に保存したホストではオフで、通常の SSH にだけ用意されています。ThinkTerm Connect には不要で、Mosh はこの報告を受け渡さないからです。

オンにしても、次に接続するまでは何も変わりません。次の接続で ThinkTerm は、シェル統合を SFTP でホストの `~/.config/thinkterm/` にコピーし、ログインシェルが読む起動ファイルに印の付いた 1 行を加えます — `.zshrc`（`ZDOTDIR` が指す場所のもの）、または `.bashrc` と bash が読むログインファイルです。ホストのそれ以外のものには触れません。どのファイルを変える前にも、すべてのファイルに書き込めるかを確かめ、途中まで進んだインストールは元に戻します。スイッチをオフにすると、次の接続で同じようにその 1 行が削除されます。

対応しているのは bash と zsh だけです。ログインシェルがそれ以外（たとえば fish）のホストでは、スイッチの下にその旨が示され、何も残されません。失敗もそこに表示され、書き込めなかったファイルが示されて、次の接続で再試行されます。接続ごとに何を済ませたかはホストに記録されるので、次の接続が同じことを繰り返すことはありません。

設定が済むと、シェルはコマンドを始めるたびにそのコマンドラインを報告し、プロンプトに戻ると消します。報告するのはそれ以降に開いたシェルで、すでに開いているシェルは報告しません。`sudo` の後ろのコマンドや、先頭に `VAR=value` が付いたコマンドは、実際に動くプログラムの名前で示されます。ローカルのペインで `ssh` と打った場合も、向こう側のシェルがこの統合を読み込んでいれば、同じ報告が読まれます。

## 接続先のサーバーにローカル端末へのアクセスを許す {#connect-reverse-access}

ThinkTerm Connect でつないだサーバーは、既定ではこのコンピュータを見られません。`設定 › エージェント › Connect の逆方向アクセス`（ベータと表示されています）を使うと、接続ごとにこれを変えられます。すでに開いている Connect の接続を通して、サーバー上のプログラムがこのコンピュータの端末を一覧し、読み取り、入力もできるようになります。ポートは開かず、あなたが許可するまでは何も許されません。アプリ、コマンドラインツール、mux サーバーはバージョンを揃えてください。どれか 1 つでも古いと、接続全体がつながらないことがあります。

サーバーを許可するには、まず接続してそのカードを開き、次のようにします。

1. `接続先サーバー` で選びます。
2. `権限` で `読み取り専用` か `読み取りと入力` を選びます。範囲は `すべてのローカルターミナル` です。このコンピュータであなたが所有するすべての端末で、許可の期間中に開いたものも含みます。選ぶための一覧はありません。
3. `認証…` を選び、このコンピュータ自身の認証で確認します。macOS ではシステムのプロンプトで、Touch ID、アカウントのパスワード、ペアリングした Apple Watch が使えます。Windows では Windows Hello かローカルアカウントのパスワード、Linux ではパスワードのプロンプトです。プロンプトには、何へのアクセスか、どれだけの期間か、どのサーバーかが書かれます。

許可は `既定の許可時間`（変えなければ 30 分、1 〜 120 分）のあいだ続きます。既定値を変えても、すでに出した許可は変わりません。カードには有効な許可が `取り消す` と `許可を更新` とともに並びます。更新するとまた認証が求められ、更新を取り消したり失敗したりしても、元の期限のままです。

すべての接続が対象になるわけではありません。パスワードだけでサインインした接続である必要があります。鍵、SSH エージェント、証明書、キーボードインタラクティブ、またはほかから再利用した接続では、カードに `パスワード認証の Connect 接続が必要` と表示されます。サーバーのホスト鍵は既知か、承認済みでなければなりません。許可の対象は、ThinkTerm がこのコンピュータで保持している端末、つまりセッションサーバーの中のもの、なければアプリ自身のものです。リモートのミラー、tmux の端末、他人の共有で参加した端末は含まれません。自分が共有に出している端末は自分のものなので対象です。

サーバー側では、いつもの `thinkterm cli` が残りを担います。そこでの `thinkterm cli list` は、このコンピュータの端末も `desktop-0123abcd/21` のような名前で、ラベル、タイトル、権限、残り時間とともに一覧し、`get-text`、`send-text`、`send-key` は `--pane` でその名前を受け付けます。

```
thinkterm cli list --json
thinkterm cli get-text --pane desktop-0123abcd/21 --trim
thinkterm cli send-text --pane desktop-0123abcd/21 --enter 'echo hi'
thinkterm cli send-key --pane desktop-0123abcd/21 ctrl+c
```

スラッシュ以降は、新しい経路ができるたびに変わるので、現在の一覧から名前をコピーしてください。読み取りはプレーンテキストだけで、画面とスクロールバックを 1 回のリクエストにつき 2,000 行・1 MiB まで返します。大きすぎるときは範囲を小さくしてください。テキスト入力は 64 KiB、キー入力は 64 キーまでで、`読み取り専用` ではその旨を伝えて何も送りません。1 つの接続で 1 秒あたり 10 リクエストほどが許され、`list` と `get-text` は順番を待ち、上限を超えた入力は何も送らずに `Busy` で拒否されます。入力の成功は、バイトが端末に届いたことを意味し、コマンドが終わったことではありません。失敗した入力は自動では再試行されません。サーバーのアカウントで動くすべてのプログラムがこの許可を共有し、特定のエージェントに限定されません。

許可は、取り消したとき、期限が切れたとき、接続が切れて張り直されたとき、デスクトップがロックされたりセッションが変わったとき、ThinkTerm が再起動したときに終わります。アップデートや引き渡しでは引き継がれないので、そのあとはもう一度許可してください。閉じた端末へのリクエストのような個々の失敗では、終わりません。

Linux では、許可にグラフィカルなセッション、パッケージ同梱のヘルパー、`zenity`、そして `/etc/pam.d/thinkterm-connect-auth` にある保護された PAM ポリシーが必要です。ディストリビューションのパッケージはポリシーを入れます。AppImage やポータブルなアーカイブでは、管理者が `share/thinkterm/connect-auth/pam` にあるものを入れ、`zenity` も入れます。Windows では、ドメイン、Microsoft、Entra のアカウントには尋ねられるパスワードがなく、動作する Windows Hello が必要です。

逆向き、つまりこのコンピュータのプログラムが、ウィンドウの接続先サーバーの端末にアクセスするのは別の設定です。[接続先サーバーのペイン](https://docs.closex.org/ja/thinkterm/cli.md#servers-terminals) を参照してください。

## 接続先のサーバーが記述できるもの

接続したサーバーが記述するのは、自分の Space だけです。そのサーバーが名乗った Space の id がすでに別の場所のあなたのもの（ローカルの既定 Space や別のドメイン）であれば、その id に紐づく project とレイアウトを置き換えさせるのではなく、受け取った側が破棄されます。サーバーが送ってこなかった Space を指す project も、既定の Space へ黙って移し替えられるのではなく破棄されます。すでに手元にあるものが、id の取り合いで変わってしまうことはありません。

## リモートをローカルのように感じさせるために

以下の挙動は ThinkTerm Connect ドメイン上のセッションに適用されます。

- **待ち時間が体感できる場合に限り、入力は往復を待ちません。** 予測的なローカルエコーはサーバーを待たずにキー入力を画面へ出しますが、実測の往復時間がしきい値（既定 100 ミリ秒）に達している場合だけ有効になります。それ未満ではサーバー自身のエコーが十分に速いため、予測は無効のままです。ローカルセッションでは常に無効です。
- **分割はローカル専用の贅沢ではありません。** 分割ツリー、第 2 階層のタブバー、ドラッグによる分割、仕切りのドラッグによるサイズ変更は、いずれもリモートで動作し、ローカルと同じように振る舞います。
- **サイズがぶれません。** 仕切りをドラッグしても、跳ね返り、圧縮、再同期の嵐は起きません。
- **仕切りは回線に見合った速さで動きます。** `設定 › ターミナル › リモート分割のサイズ変更` は、仕切りのドラッグがいつサーバーに届くかを決めます。既定の `自動` は、速い接続では継続的に、遅い接続では最終サイズだけを送ります。`ライブ` は常に継続的に送り、`離したとき` は手を離したときだけ送ります。
- **ホイールが正確です。** `vim` や `less` のようなマウスモードのプログラムでは、元のノッチ数が保たれるため、スクロールが速すぎることも遅すぎることもありません。
- **クライアントの状態はあなたのものです。** フォーカスと選択範囲はローカルが正であり、サーバーのエコーで乱されません。各クライアントが自分のパレットを持つため、片方の端末でテーマを変えてももう一方は変わりません。
- **画像がリモートのペインにも届きます。** 画像と kitty プロトコルのアニメーションはローカルと同じようにリモートのペインで表示され、ストリーミング中の画像も毎フレーム失われることなく画面に残ります。

## 関連

- [ウェブアクセス](https://docs.closex.org/ja/thinkterm/web.md) — 同じセッションをブラウザから開く
- [ファイルとノート](https://docs.closex.org/ja/thinkterm/files-and-notes.md) — 接続先ホストのファイルを閲覧・転送する
- [設定](https://docs.closex.org/ja/thinkterm/configuration.md) — ホスト帳と鍵の保存場所
- [インストール](https://docs.closex.org/ja/thinkterm/install.md) — ホスト向けのサーバー版
- [アップデート](https://docs.closex.org/ja/thinkterm/updates.md) — リモートサーバーを同じバージョンにそろえる
