求助, Mac 不知道从哪天开始,无 ssh 连接 hostname 中带有中文字符的主机了

45 天前
 GoodRui

自带 终端itermwarp、包括vs code,使用 ssh config 配置文件远程服务器时,如果 ssh config 配置文件中的主机名含有中文字符,就提示 hostname contains invalid characters 无法连接。有没有大佬遇到过同样的问题解决过的?谢谢~

ssh config 配置文件中的示例:

Host 测试.63
	User root
	HostName 172.16.111.63
	Port 22

ssh 时的输出

❯ ssh -v -T -D 58228 -o ConnectTimeout=15 测试
hostname contains invalid characters
1564 次点击
所在节点    macOS
19 条回复
GoodRui
45 天前
上面使用 ssh 连接的时候,是使用的 `测试.63` 主机名连接的
drymonfidelia
45 天前
第一次知道 hostname 还能包含中文的
daveh
45 天前
ssh 命令行中使用 测试.63 而不是 测试。
如果还有问题,检查文件内容是否 UTF-8 ,locale 是否支持 UTF-8 。
sinxccc
45 天前
何必自己给自己加难度呢
bao3
45 天前
我也是第一次知道还能用中文……我用了 20 多年的 ssh ,我哭。
GoodRui
45 天前
@sinxccc 大哥我光这个 config 配置就两千多行,几百台服务器,一直用的好好的,本子都用了 3 年了,出了问题不解决难道一把梭抹掉重来吗?
GoodRui
45 天前
@daveh 感谢老哥回复,1 楼有说明,这个是在不断重命名时截取的输出,上下的配置不是同一时间所以有出入,但是是示例,实际操作时肯定都是正确的。2 千多行的配置,几百台服务器,用了 3 年多了,突然出现异常肯定不是个别服务器配置错误导致的。下午试了十几台了,只要是 hostname 中有中文字符的全不行了😖
GoodRui
45 天前
@bao3 可能主机数量少的话也无所谓,但是我平时运维的主机数量比较多,两千行的配置,可能得 200 多台服务器。光 10.0.0.10 就十几台...hostname 都是详细的信息。
GoodRui
45 天前
@drymonfidelia hostname 随便起啊,对于 ssh config 来说就是个 tag ,不影响远端服务器本身信息。
drymonfidelia
44 天前
@GoodRui 我上个月才知道终端里支持输入中文,记得以前输入中文都乱码,我 hostname 都是客户名字的拼音加用途英文
GoodRui
44 天前
@drymonfidelia 其实我倒是也很少直接在终端里输入中文 hostname 连,只是管理起来方便,用自动补全、历史命令之类的,很快就能补出目标主机,很是方便。还有就是使用 vscode 的时候输中文连接比较方便。还有就是 Windows 下也一样很方便。主要是管理的服务器太多了...
Yadomin
44 天前


可能不怪 mac ,你可以自己编译一个旧的用
sinxccc
44 天前
@GoodRui 抱歉,我不知道你是已有的旧配置,以为是你在写新的。
mritd
44 天前
学到了😂
GoodRui
44 天前
@Yadomin 感谢老哥提供思路,尝试了下确实是这个问题,以下是 openssh 的更新记录,高亮部分提到的应该是影响 hostname 中含中文的情况:



使用 homebrew 安装了 9.5p1 版本的 openssh ,恢复正常。



感觉这个改动影响挺大的,包括 Reddit 上也有老外反馈,使用 `a human readable Host like "Web Host A - Client Name"` 这种的也不行了。

哎不知道以后咋搞。
march1993
43 天前
提 issue 吧,毕竟域名里可以有中文,hostname 就不能有中文了?
GoodRui
43 天前
@march1993 貌似提不了 issue 呢,官方的公告说了这是为了修复漏洞,不光是中文字符,连一些字符比如空格都给禁用了,估计不好办。
march1993
41 天前
@GoodRui 应该不是 openssh 问题,我感觉是 mac 问题。我单独跑了这段代码,测试没问题的
```c
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdint.h>

typedef unsigned char u_char;

static int
valid_hostname(const char *s)
{
size_t i;

if (*s == '-')
return 0;
for (i = 0; s[i] != 0; i++) {
if (strchr("'`\"$\\;&<>|(){}", s[i]) != NULL ||
isspace((u_char)s[i]) || iscntrl((u_char)s[i]))
return 0;
}
return 1;
}

int main(int argc, char * argv[]) {
char* testCJK = "测试.63";
//char* testCJK = "Abc 你好こんにちは안녕하세요";
printf("valid_hostname(testCJK): %s\n", valid_hostname(testCJK) ? "true" : "false");
}
```
GoodRui
41 天前
@march1993 不过这个我确实换了 9.5p1 版本的 openssh 就可以了,而且 9.6p1 版本的 release 里面确实有提到这个。Reddit 上也有关于这个的讨论。
更深的原理就不懂了,能用就行了...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1026819

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX