ssh-agent に、サブコマンドを指示する引数を付けた場合の挙動について

ssh-agent には次のようにして、サブコマンドを指示する引数を付ける起動法があります。

ssh-agent cmd

たとえば ssh-agent bash のようにして、エージェント配下の環境を引き継ぐために使うものですが、man ssh-agent を読むと、その際の挙動について、次のようにあります。

If a command line is given, this is executed as a subprocess of the
agent.  When the command dies, so does the agent.

そのまま素直に読めば ssh-agent が親プロセスとなり、子プロセスの側で引数として名前を与えたものを exec する、という意味に読めます*1……が、実際にやってみると、逆であることがわかります。

以下は私の手元の FreeBSD で、試してみた一例ですが(ps コマンドの結果から見つけやすくするため、起動するコマンドは csh にしています)、

$ exec ssh-agent csh
% ps axd
  PID TT  STAT       TIME COMMAND
    0  -  DLs     4:16.86 [kernel]
    1  -  ILs     0:00.08 - /sbin/init --
  121  -  Is      0:00.01 |-- adjkerntz -i
(略)
73430 v0  R       0:00.63 |-- mlterm
73431 15  Ss      0:00.08 | `-- csh
73445  -  Ss      0:00.00 |   |-- ssh-agent csh
73910 15  R+      0:00.01 |   |-- ps axd
73911 15  S+      0:00.01 |   `-- less

というように、親プロセスのほうが引数として与えたほうを exec していて、ssh-agent は子プロセスの側に、つまり、それ以降にこのシェルから実行されるプロセスから見ると、きょうだいプロセスの位置にあります。

実装の変更にドキュメントが追随していないだけか、とも思ったのですが、どうも最初からのようです。

もうちょっと調査したら、OpenSSH プロジェクトに報告するつもりで……いたのですが、だいぶ放置してしまっています。どこにもアウトプットしてなかったので、ここに置いておきます。

*1:記憶にある限り、既存の解説書などの図でも、全てそのようになっています。