[{"data":1,"prerenderedAt":342},["ShallowReactive",2],{"content-/tailscale-cross-machine-claude-code-codex":3,"all-pages-for-dir":320,"related-/tailscale-cross-machine-claude-code-codex":321,"og-image-/tailscale-cross-machine-claude-code-codex":341},{"id":4,"title":5,"body":6,"category":300,"concepts":301,"description":302,"extension":303,"meta":304,"navigation":213,"ogImage":301,"path":305,"project_name":306,"published":307,"publishedAt":308,"seo":309,"source":310,"stem":311,"tags":312,"todo":301,"unpublished":307,"updatedAt":301,"__hash__":319},"pages/2026-10/2026-10-24/tailscale-cross-machine-claude-code-codex.md","Tailscaleで2台のPCのClaude CodeとCodexをつなぐ検討：IP探索は消えるがセッションへの割り込みは残る",{"type":7,"value":8,"toc":291},"minimark",[9,14,23,26,30,39,42,45,49,52,55,75,78,89,92,96,99,146,153,156,160,167,182,190,193,196,199,202,273,276,279,287],[10,11,13],"h1",{"id":12},"tailscale-で2台の-claude-code-と-codex-をつなぐ検討","Tailscale で2台の Claude Code と Codex をつなぐ検討",[15,16,17,18,22],"p",{},"Mac と Windows の2台で、Claude Code と Codex を使っている。\n片方のセッションからもう片方へ連絡するための ",[19,20,21],"code",{},"cross-machine-message"," スキルを作っている途中で、ふと思った。\nTailscale を入れれば、こんな仕組みを作り込まなくても普通に通信できるのではないか。",[15,24,25],{},"そのまま Claude Code に聞いてみた。\n返ってきたのは「通信の土台としてはかなり楽になる。ただ、Tailscale が解決するのは『相手の機械にどう届くか』だけ」という答えだった。",[27,28,29],"h2",{"id":29},"いまのスキルは何に手間をかけているのか",[15,31,32,33,38],{},"今のスキルは、LAN の中で Windows から Mac へ直接送る。\nMac 上の小さな HTTP サーバーが本文を受け取り、tmux のペインに貼る仕組みである（作った経緯は",[34,35,37],"a",{"href":36},"/claude-code-cross-machine-lan-bridge","別のPCのClaude Codeに話しかける記事","に書いた）。",[15,40,41],{},"手間がかかっているのは、送る前に「Mac がどこにいるか」を探す部分だ。\nMac の IP は DHCP で変わる。\nWi-Fi と有線で口が2つあり、口ごとに IP が違う。\nmacOS のプライベート Wi-Fi アドレスのせいで、機器番号（MAC アドレス）まで変わる。",[15,43,44],{},"そのためスキルには、IP の総当たり、機器番号の照合、SSH のホスト鍵の指紋による本物確認が積み重なっている。\n2-1-b の節はまるごと、2-1 の節もその一部が、この確認の話である。",[27,46,48],{"id":47},"tailscale-で消えるもの残るもの","Tailscale で消えるもの、残るもの",[15,50,51],{},"Claude Code の整理では、Tailscale を入れると 2-1 と 2-1-b のほぼ全部が要らなくなる。\n端末に固定の IP と MagicDNS の名前が付くので、Mac を探す必要そのものが無くなる。",[15,53,54],{},"消えるのは次の4つである。",[56,57,58,66,69,72],"ul",{},[59,60,61,62,65],"li",{},"IP の探索（送信スクリプトの自動探索、前回の接続先の記録、",[19,63,64],{},"--pin"," による登録）。MagicDNS の名前で固定できる",[59,67,68],{},"機器番号とホスト鍵の指紋による本物確認。tailnet の端末認証が代わりに保証する",[59,70,71],{},"「同じ LAN にいる」という前提。外出先やテザリングでもつながる",[59,73,74],{},"SSH の接続元の制限。LAN のアドレス範囲を、tailnet のアドレス範囲に置き換える",[15,76,77],{},"一方で、次の3つは残る。",[56,79,80,83,86],{},[59,81,82],{},"Mac の受信サーバーの自動起動。LaunchAgent に登録しておらず、Mac を再起動すると止まる",[59,84,85],{},"動いているセッションへの注入。Mac 側は tmux への注入で、相手がアイドルのときしか届かない。Windows 側には受け口が無い",[59,87,88],{},"Codex には、動いているセッションへ話しかける口がそもそも無い",[15,90,91],{},"並べてみると、Tailscale が肩代わりするのは「どの機械に届けるか」の層だけだと分かる。\n届いた本文を走っているセッションの入力欄へどう差し込むか、という層は今のまま必要になる。",[27,93,95],{"id":94},"割り込まずに相手の機械で使い切りで動かす","割り込まずに、相手の機械で使い切りで動かす",[15,97,98],{},"「いちばん効く」として挙がったのは、別の使い方だった。\n動いているセッションに割り込むのをやめて、相手の機械で新しく使い切りの実行をさせ、結果だけを受け取る。",[100,101,106],"pre",{"className":102,"code":103,"language":104,"meta":105,"style":105},"language-bash shiki shiki-themes vitesse-light vitesse-light","ssh \u003Cmac> 'cd ~/git_repo/xxx && claude -p \"…\"'   # Codex なら codex exec \"…\"\n","bash","",[19,107,108],{"__ignoreMap":105},[109,110,113,117,121,125,129,132,136,139,142],"span",{"class":111,"line":112},"line",1,[109,114,116],{"class":115},"senZ8","ssh",[109,118,120],{"class":119},"stQ0i"," \u003C",[109,122,124],{"class":123},"sdGka","ma",[109,126,128],{"class":127},"sG7-3","c",[109,130,131],{"class":119},">",[109,133,135],{"class":134},"sMJiu"," '",[109,137,138],{"class":123},"cd ~/git_repo/xxx && claude -p \"…\"",[109,140,141],{"class":134},"'",[109,143,145],{"class":144},"sxvE3","   # Codex なら codex exec \"…\"\n",[15,147,148,149,152],{},"この形なら、注入もアイドル判定も要らない。\n話しかける口の無い Codex も、",[19,150,151],{},"codex exec"," ならこの形に乗る。",[15,154,155],{},"ただし制約もある。\nTailscale SSH のサーバーは Windows に対応していない、というのが Claude Code の認識で、これはまだ一次情報で確かめていない。\nMac から Windows へ同じことをするには、Windows の OpenSSH Server を有効にする必要がある。\nどれも案の段階で、まだ1つも試していない。",[27,157,159],{"id":158},"入っていないは誤りだった","「入っていない」は誤りだった",[15,161,162,163,166],{},"Claude Code から最初に返ってきた答えは、この Windows 機にはまだ Tailscale が入っていない、というものだった。\nところが、進捗メモに残った実測では、Tailscale 1.102.2 はインストール済みで、サービスも Running だった。\n",[19,164,165],{},"which tailscale"," が空を返したのは、コマンドが PATH に無かっただけである。",[15,168,169,170,173,174,177,178,181],{},"入ってはいたが、つながってもいなかった。\n",[19,171,172],{},"tailscale status"," は ",[19,175,176],{},"Tailscale is starting"," と ",[19,179,180],{},"unexpected state: NoState"," を出し、終了コード1で終わった。",[15,183,184,185,189],{},"同じ症状は、7月5日にリモートデスクトップのために Tailscale を検討したときにも出ていた。\nその日は",[34,186,188],{"href":187},"/tailscale-rdp-setup-review","手順書のレビュー","もしていた。\n当時の見立ては、Run unattended を設定していないためにサインイン待ちになっている、というものだった。",[15,191,192],{},"Mac 側に Tailscale が入っているかどうかは、まだ確かめていない。",[27,194,195],{"id":195},"明日に回した9項目",[15,197,198],{},"今日はここで切り上げ、進捗メモと、明日のセッションに貼るプロンプトを Claude Code に作らせた。\nプロンプトは、ダウンロードフォルダにテキストファイルで置いてもらった。\n2つのファイルがディスク上にあることまでは確かめてもらったが、コミットはまだしていない。",[15,200,201],{},"進捗メモの状態は「進行中」で、残りは9項目ある。",[56,203,206,216,222,228,234,240,246,258,264],{"className":204},[205],"contains-task-list",[59,207,210,215],{"className":208},[209],"task-list-item",[211,212],"input",{"disabled":213,"type":214},true,"checkbox"," Windows: Tailscale にサインインして Connected にし、Run unattended を有効にする",[59,217,219,221],{"className":218},[209],[211,220],{"disabled":213,"type":214}," Windows: IP と MagicDNS 名を控える",[59,223,225,227],{"className":224},[209],[211,226],{"disabled":213,"type":214}," Mac: Tailscale を入れて同じアカウントでログインし、IP と名前を控える",[59,229,231,233],{"className":230},[209],[211,232],{"disabled":213,"type":214}," 管理コンソールで、両機の key expiry を無効にする",[59,235,237,239],{"className":236},[209],[211,238],{"disabled":213,"type":214}," Windows → Mac: tailnet の名前で SSH が通るか確かめる",[59,241,243,245],{"className":242},[209],[211,244],{"disabled":213,"type":214}," 送信スクリプトの宛先を MagicDNS 名にして、LAN 用のブリッジが tailnet 経由でも届くか確かめる",[59,247,249,251,252,177,255,257],{"className":248},[209],[211,250],{"disabled":213,"type":214}," Windows → Mac: ",[19,253,254],{},"claude -p",[19,256,151],{}," の使い切り実行が通るか確かめる",[59,259,261,263],{"className":260},[209],[211,262],{"disabled":213,"type":214}," Tailscale SSH サーバーが Windows 非対応かどうかを一次情報で確かめ、Mac → Windows 方向の手段を決める",[59,265,267,269,270,272],{"className":266},[209],[211,268],{"disabled":213,"type":214}," 検証の結果を、",[19,271,21],{}," スキルへ反映する案にまとめる（IP 探索の節を縮め、使い切り実行の経路を足す）",[15,274,275],{},"最後の項目には注意書きがある。\nスキルの本体は別のセッションで作っている最中なので、反映する前に私へ確認を取る、という内容だ。",[27,277,278],{"id":278},"学び",[56,280,281,284],{},[59,282,283],{},"Tailscale が楽にするのは「相手の機械にどう届くか」までだった。スキルでいちばん面倒な IP 探索の層は消えるが、動いているセッションへの割り込みは別の問題として残る",[59,285,286],{},"コマンドが PATH に無いことと、入っていないことは別だった。サービスの状態とインストール先まで見て、ようやく「入っているが、つながっていない」と分かった",[288,289,290],"style",{},"html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .sG7-3, html code.shiki .sG7-3{--shiki-default:#393A34;--shiki-dark:#393A34}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":105,"searchDepth":292,"depth":292,"links":293},2,[294,295,296,297,298,299],{"id":29,"depth":292,"text":29},{"id":47,"depth":292,"text":48},{"id":94,"depth":292,"text":95},{"id":158,"depth":292,"text":159},{"id":195,"depth":292,"text":195},{"id":278,"depth":292,"text":278},"dev",null,"MacとWindowsのClaude Code、Codexを結ぶ連絡スキルを作る途中で、Tailscaleを入れれば簡単につながるのではと考えた。消える仕組みと残る仕組みを整理し、入っていないとされたTailscaleが実は入っていて未接続なだけだった記録。","md",{},"/tailscale-cross-machine-claude-code-codex","claude-code-tools",false,"2026-10-24T00:00:00.000Z",{"title":5,"description":302},"make-diary","2026-10/2026-10-24/tailscale-cross-machine-claude-code-codex",[313,314,315,316,317,318],"Tailscale","Claude Code","Codex","SSH","tmux","ネットワーク","20kehxSqJs3Bo3xnbL9QuoCQ-UyWNCRc7uGSOOasVMc",[],[322,326,330,334,337],{"title":323,"path":324,"publishedAt":325},"シーン回帰テストの区間選びを改修し、メモリ逼迫からWindowsとMacのLAN直送を作った日","/windows-mac-lan-messaging-regression-memory","2026-10-05T00:00:00.000Z",{"title":327,"path":328,"publishedAt":329},"Excel講座の「AIの活用」章を作り直す：メモリ不足で止まった音声合成をMacBookのセッションに任せた記録","/ai-tools-section-plan-mac-handoff","2026-10-04T00:00:00.000Z",{"title":331,"path":332,"publishedAt":333},"常時稼働のLinuxが付くAI Botの使いどころ：Claude Codeとの線引きで解説記事を書き直した","/always-on-cloud-agent-research","2026-09-02T00:00:00.000Z",{"title":335,"path":36,"publishedAt":336},"別のPCのClaude Codeに話しかける — ブラウザ操作をやめてLANのHTTPで往復させた","2026-08-18T00:00:00.000Z",{"title":338,"path":339,"publishedAt":340},"別のAIがOCRした書籍のSQLiteを蔵書DB（Turso）へ取り込む前のレビューと、Googleタスク33件の棚卸し","/book-kb-ocr-sqlite-turso-import-and-task-review","2026-10-29T00:00:00.000Z","https://log.eurekapu.com/og/blog/tailscale-cross-machine-claude-code-codex.png?v=2026-10-24T00%3A00%3A00.000Z&title=Tailscale%E3%81%A72%E5%8F%B0%E3%81%AEPC%E3%81%AEClaude%20Code%E3%81%A8Codex%E3%82%92%E3%81%A4%E3%81%AA%E3%81%90%E6%A4%9C%E8%A8%8E%EF%BC%9AIP%E6%8E%A2%E7%B4%A2%E3%81%AF%E6%B6%88%E3%81%88%E3%82%8B%E3%81%8C%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%B8%E3%81%AE%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E3%81%AF%E6%AE%8B%E3%82%8B&author=Kei%20Komatsu&sig=63f084392cc743f6",1793331572237]