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なしで "*"とハードコードを削除することです。各ホストのエントリが必要です...