- 候補: (A) PowerShell ネイティブで
$env:SSH_CONNECTIONを分解してスペック生成(1ラウンドトリップ)、(B) SSH_CONNECTION を取得して Go でスペック生成(ラウンドトリップ追加)。 - (B) を採用。Issue が「パースロジックのユニットテスト」を明示要求しており、Match ルールは非 loopback ホストが必要で e2e 検証不能。Go の純粋関数なら CI で検証できる。ラウンドトリップ1回の追加コストは許容。
- Issue 制約「real addr と fake host=localhost を混ぜるな」「古い sshd は user/host/addr 必須」の両方を満たす。
- host を実 IP で供給することで sshd バージョン依存(host 必須要件)を回避。
Match Host <exact-ip>誤発火リスクは実質ゼロ(IP には通常Match Addressを使う)。 laddr/lportも SSH_CONNECTION の server 側から導出し、Match LocalAddress/LocalPort にも対応。
- 当初は
strings.TrimSpace(connOut)をstrings.Fieldsで分解していたが、実機プローブでWrite-Output $env:SSH_CONNECTIONの出力に CLIXML(#< CLIXMLヘッダ +<Objs>XML)が混入することが判明。フィールド数が4超になり常にフォールバック= silent no-op だった。 parseSSHConnectionSpec(単一値の検証・スペック生成)とsshdMatchSpecSuffixFromOutput(出力を行スキャンして一致行を抽出)に分割。effectiveAdminKeysFromSshdTと同じ行スキャン方針に揃えた。詳細は LESSONS.md。
- 確認済み(loopback 実機 127.0.0.1): SSH_CONNECTION は EncodedCommand セッションで populate される / CLIXML 混入下でも実スペックを抽出できる / 実機 sshd が
laddr/lport込みスペックを exit 0 で受理する(フォールバックに落ちない)。 - 未確認(loopback では不可能):
Match Address/Match Hostルール下での誤判定の実際の解消。loopback クライアントでは新スペックのaddr=127.0.0.1が旧固定値と機能的に同一のため、本来のバグシナリオは exercise されない。修正は correct-by-construction。非 loopback クライアントでの検証は今後の課題。