我在 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 的硬代码。我需要为每个主机提供一个条目...