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

관련 정보