Dance with Agents

離れたもう1台のパソコンを、エージェントに直してもらう

向きが逆でもいい

Tailscaleの記事では「出先から自宅のパソコンへ」という向きで書きました。スマホから母艦につないで、寝ながら開発する、という話です。

ですが同じ仕組みは、逆向きにも、横向きにも通ります。

  • 母艦のMac miniから、持ち出し用のMacBook Airへ
  • MacBook Airから、置きっぱなしのミニPCへ

自分のデバイス同士が「同じ家の中にいる」状態になるだけなので、どっちがどっちを呼んでもいい。 ここに気づくと、使い道が一段増えます。

何をしたか

先日、こういうことがありました。

MacBook Airのほうでzコマンド(cdを打つのが面倒になったらで紹介したzoxide)のTab補完が働かない。直し方はMac mini側で作業していたエージェントとの会話で判明していて、~/.zshrcに数行足せば済む。

普通なら、エージェントに手順を書いてもらって、それを自分でMacBook Airに貼り付けます。 それでもいいのですが、こう頼んでみました。

Tailscaleでそっちに入って、直しておいて

結果、エージェントがやったのはこれだけのことです。

  1. Tailscale経由でMacBook Airに接続できるか確認
  2. ~/.zshrcをバックアップ
  3. 設定を追記
  4. 文法チェック
  5. 向こうでシェルを起こして、実際にz+Tabを打って、意図した場所に移動できることを確認
  6. 検証に使った一時ファイルを削除

5番が肝です。「たぶん動くはずです」ではなく、向こう側で動かして確かめてから報告してくる。 手順書を受け取って自分で貼る場合との違いはここにあります。うまくいかなかったときに気づくのが、自分ではなくエージェントになる。

詰まるのは「届くか」ではなく「入れるか」

このとき最初に返ってきたのは、こういう報告でした。

  • Tailscaleの到達性 … OK(往復6ミリ秒)
  • SSHの入口(22番ポート) … 開いている
  • ログイン … 失敗
Permission denied (publickey,password,keyboard-interactive)

ネットワークは最初から通っていて、止まっていたのは認証だけだったわけです。

この切り分けの順番は、覚えておくと毎回効きます。

確認すること 分かること
相手が一覧に表示されているか(tailscale status) そもそもオンラインか
22番ポートが開いているか 相手が接続を受け付ける設定になっているか(Macなら「リモートログイン」がON)
ログインできるか 鍵かパスワードの問題

上の2つが通っていれば、ネットワークやTailscaleを疑うのはやめていいということです。「繋がらない」と一括りにすると、関係ないところを延々と触ることになります。

ちなみに上のエラーメッセージの(publickey,password,keyboard-interactive)は「この3つの方法なら受け付けますよ」という案内であって、失敗した理由の説明ではありません。ユーザー名を間違えたときも同じ文言が表示されるので、これだけでは原因を絞れない、というのも知っておくと悩まずに済みます。

SSHの鍵を使う設定にしてあるかどうかで、任せられる範囲が変わる

ここが、この記事でいちばん書きたかったところです。

パスワードでログインする設定のままだと、エージェントには頼めません。 パスワードを渡すわけにはいかないからです。渡さない限り、エージェントは入口の前で止まります。

鍵(公開鍵認証)にしてあれば、頼めます。 エージェントは手元にある鍵を使って、パスワードを一度も見ることなく向こうへ接続できます。

つまりSSH鍵の設定は、「パスワードを打つのが面倒だから」の話ではなくて、「作業を人以外に任せられる形にしておく」という話でもあります。自動化やエージェントが絡んだ瞬間に、この差が表面化します。

やることは、接続される側で1行です。手元の公開鍵(.pubで終わるファイルの中身)を、向こうの~/.ssh/authorized_keysに書き足します。

mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo 'ssh-ed25519 AAAA...ここに公開鍵の中身... you@example.com' >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

公開鍵のほうは、人に見せても構わないものです(秘密鍵は絶対に渡しません)。この区別が曖昧ならSSHの肝を先に読んでおくと安心です。chmodが付いているのは、権限が緩いとSSHが鍵を無視するためで、ここは省略できません。

落とし穴:似た名前のマシンが2台あると

今回いちばん時間を溶かしかけたのが、これです。

Mac mini側の~/.ssh/configには、すでにairという接続先が登録されていました。が、それが指していたのは別のMacBook Airで、しかも2日前からオフラインでした。同じ人が同じような名前のマシンを2台持っていると、普通に起こります。

Host air
  HostName 100.99.45.67    ← こっちは前の機体(オフライン)

名前で呼べるのは便利ですが、その名前が今どの機体を指しているかは、自分で確かめないと分かりません。 tailscale statusを見ると、各デバイスのアドレスと、オンラインかどうか、最後に見かけたのがいつかが並びます。

100.86.12.34   my-macbook-air     macOS  active; direct ...
100.99.45.67   my-macbook-air-1   macOS  offline, last seen 2d ago

古いエントリは、削除するより別名で足すほうが安全です。削除すると、そのうち戻ってきた機体に繋げなくなります。

Tailscale SSHという別解(ただしMacでは)

Tailscaleには、鍵の管理そのものを省く「Tailscale SSH」という機能があります。鍵を配らなくても、Tailscaleのアカウントで認証が済む仕組みです。

魅力的なのですが、接続される側がMacだと基本的に使えません。 公式ドキュメントでは、サーバー側の対応が「Linux」と「macOSのオープンソース版(tailscaledのCLI版)」に限られると明記されています。App Storeからインストールした普通のMac版は、接続する側にはなれても、接続される側にはなれません。

Mac同士でやるなら、素直にSSH鍵を置く。これが今のところの答えです。

任せる前に決めておくこと

便利ですが、別のパソコンを触らせるということなので、線引きだけ先に決めておくのが良いと思います。

  • 相手は自分の持ち物に限る。 借り物や貸与品は、そもそも規則の確認が先です(Tailscaleの記事にも書いたとおり、ネットワークに関わる道具なので勝手にインストールしてよいとは限りません)
  • 設定ファイルは触る前にバックアップさせる。 ~/.zshrcのような、壊れると次からシェルが立ち上がらなくなるファイルは特に。今回も~/.zshrc.bak-20260810を残してあります
  • 何をどう変えたか、報告させる。 向こうで起きたことは自分の画面に映りません。追記した内容そのものを見せてもらうのがいちばん確実です
  • 一時ファイルを片付けさせる。 検証用のファイルが相手のマシンに残りがちです

どれも「エージェントだから」という話ではなく、自分がリモートで作業するときにやるべきことと同じです。相手が自分でなくなったぶん、口に出して指示する必要があるだけ、と考えると分かりやすいと思います。

まとめ

Tailscaleは「出先から自宅へ」の道具として紹介されがちですが、実態は自分のデバイス同士をつなぐ回線なので、向きは自由です。

そして繋がった先は、自分が手で作業する場所であると同時に、エージェントに任せられる場所でもあります。その境目にあるのが鍵認証です。パスワードのままだと自分しか接続できない。鍵にしておくと、頼める。

2台目のパソコンが「たまに持ち出す、設定が古いままのマシン」になりがちなら、繋いで、任せてしまうのは悪くない手です。

リモート開発環境の記事

リモート開発環境のページへ →