私が知る限り、これはWSLのバグです。うまくいけば、Microsoftは次のビルドでそれを修正するでしょう。しかし、今のところ、この少しいハックを使用できます。
アップデート#1:間違いなくバグ。この問題はGithubで発見されました。このすべてをやりたくない場合は、Thierがシェルの再起動の回避策を提案しました。
TL; DRこれを追加して、SSH構成を終了します(通常はにあります~/.ssh/config
)。
Host *
ProxyCommand nc %h %p %r
それが動作する理由はここにあります:私たちのSSHの問題は、ファイアウォールの問題ではありませんnc
し、telnet
仕事と同じホストとポート(しようとするtelnet <host> <port>
かnc <host> <port>
:あなたのようなものが表示されるはずですSSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.7
)。これは私たちにとって有利に使用できます。
SSHでは、ProxyCommand
オプションを使用して標準入力を取得し、サーバーのポートに送信するプロキシを使用できます。これは通常、ジャンプホストとも呼ばれる中間要塞SSHサーバーを使用して、保護されたホストへのネットワークへのトンネリングに使用されます(詳細については、このリンクを参照してください)。
このハックは、ジャンプホストなしでプロキシを使用するようSSHに指示します。したがって、すべてのネットワークリソース割り当てをNetcatにプッシュすることにより、SSHのTCPリソースの割り当ての失敗を回避できます。SSHはネットワーク接続なしでSSHを実行するだけで、NetcatはTCP接続を介して生データをSSHサーバーに送信します。
警告:これProxyCommand
によりすべてのホストが変更されるため、を使用する他のSSH構成ホストとのやり取りがわかりませんProxyCommand
。これをテストできるサーバーがいくつかあり、この回答を結果で更新します。有害な副作用がない可能性がありますが、それを保証することはできません。
更新#2:いくつかのサーバーでいくつかのテストを行いましたが、これはうまくいくようです。SSHは、複数のエントリが適用される場合、構成の最上位エントリを使用します。したがって、ProxyCommand
このハックの上に存在する存在はそれを上書きします。新しいSSHコマンドが実行されると、SSH設定が再読み込みされ、他ProxyCommand
にSSH がない場合、SSHはハックを使用ProxyCommand
して「最も外側の」SSHセッションにのみ適用できるようにします。警告:設定ファイルの上部(またはSSHしようとしているエントリの上)にハックを置くと、aを必要とするSSHセッションProxyCommand
はもう一方を無視しProxyCommand
、代わりにホストのアドレスを解決して接続しようとしますNetcatで直接。