SSH 構成ファイル、%h 大文字の使用に関する問題 - ProxyCommand の問題

SSH 構成ファイル、%h 大文字の使用に関する問題 - ProxyCommand の問題

SSH設定ファイルにセクションを作成しましたが、ProxyCommandを実行しようとすると大文字と小文字の問題があります。一度入力すると、SystemDevice設定ファイルからsystemdevice小文字に戻ります。私の正確な入力に従って実行されません。いくつかの調査を行った結果、私の問題を解決できることがわかりましたが、%nこれはProxyCommandでは機能しません。percent_expand: unknown key %n使用しようとするとわかります。

マニュアルページを読むと次のようになります。

ProxyCommand は %%、%h、%p、%r タグを受け入れます。

私のSSH設定:

Host SystemDevice*
    User test
    ProxyCommand socat UNIX:/Devices/%h -

以下を実行しようとするとエラーが発生しますssh SystemDevice1001

socat[4088] E connect(5, AF=1 "/Devices/systemdevice1001", 39): No such file or directory
ssh_exchange_identification: Connection closed by remote host

小文字を使用するように設定を変更すると、魅力のように動作します!問題は小文字を使用できますが、私の知識で解決策があるかどうかを確認したいということです!オンラインでこれに関連するコンテンツが見つかりません。

私のオペレーティングシステム:Ubuntu 16.04.2 LTS(GNU / Linux 4.4.0-119-generic x86_64)

答え1

私もこの問題に直面しました。 opensshにバグがあるようですが、これを避ける方法がないと思います。

opensshのソースコードを見てみると、main.cで "lowercase()"関数が呼び出されることがわかりました。私が考えることができる唯一の理由は、DNSホスト名が通常大文字と小文字を区別しないことです。

1038
1039         /* If canonicalization requested then try to apply it */
1040         lowercase(host);
1041         if (options.canonicalize_hostname != SSH_CANONICALISE_NO)
1042                 addrs = resolve_canonicalize(&host, options.port);
1043

後で「ssh_connect」で同じ「host」変数を使用します。

1266         /* Open a connection to the remote host. */
1267         if (ssh_connect(host, addrs, &hostaddr, options.port,
1268             options.address_family, options.connection_attempts,
1269             &timeout_ms, options.tcp_keep_alive,
1270             options.use_privileged_port) != 0)
1271                 exit(255);

最後に、sshconnect.cコードは、ProxyCommandが%h、%p、および%rのみをサポートしていることを示しています。

87   expand_proxy_command(const char *proxy_command, const char *user,
88       const char *host, int port)
89   {
90           char *tmp, *ret, strport[NI_MAXSERV];
91
92           snprintf(strport, sizeof strport, "%d", port);
93           xasprintf(&tmp, "exec %s", proxy_command);
94           ret = percent_expand(tmp, "h", host, "p", strport,
95               "r", options.user, (char *)NULL);
96           free(tmp);
97           return ret;
98   }

また、ProxyCommandに元の「大文字」名が必要です。これを得る唯一の方法は、%hなしで "*"とハードコードを削除することです。各ホストのエントリが必要です...

関連情報