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 없이 "*"와 하드 코드를 제거하는 것입니다. 각 호스트에 대한 항목이 필요합니다...