自带 终端
、iterm
、warp
、包括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
1
GoodRui OP 上面使用 ssh 连接的时候,是使用的 `测试.63` 主机名连接的
|
2
drymonfidelia 246 天前
第一次知道 hostname 还能包含中文的
|
3
daveh 246 天前 via iPhone
ssh 命令行中使用 测试.63 而不是 测试。
如果还有问题,检查文件内容是否 UTF-8 ,locale 是否支持 UTF-8 。 |
4
sinxccc 246 天前
何必自己给自己加难度呢
|
5
bao3 246 天前 1
我也是第一次知道还能用中文……我用了 20 多年的 ssh ,我哭。
|
6
GoodRui OP @sinxccc 大哥我光这个 config 配置就两千多行,几百台服务器,一直用的好好的,本子都用了 3 年了,出了问题不解决难道一把梭抹掉重来吗?
|
7
GoodRui OP @daveh 感谢老哥回复,1 楼有说明,这个是在不断重命名时截取的输出,上下的配置不是同一时间所以有出入,但是是示例,实际操作时肯定都是正确的。2 千多行的配置,几百台服务器,用了 3 年多了,突然出现异常肯定不是个别服务器配置错误导致的。下午试了十几台了,只要是 hostname 中有中文字符的全不行了😖
|
8
GoodRui OP @bao3 可能主机数量少的话也无所谓,但是我平时运维的主机数量比较多,两千行的配置,可能得 200 多台服务器。光 10.0.0.10 就十几台...hostname 都是详细的信息。
|
9
GoodRui OP @drymonfidelia hostname 随便起啊,对于 ssh config 来说就是个 tag ,不影响远端服务器本身信息。
|
10
drymonfidelia 246 天前
@GoodRui 我上个月才知道终端里支持输入中文,记得以前输入中文都乱码,我 hostname 都是客户名字的拼音加用途英文
|
11
GoodRui OP @drymonfidelia 其实我倒是也很少直接在终端里输入中文 hostname 连,只是管理起来方便,用自动补全、历史命令之类的,很快就能补出目标主机,很是方便。还有就是使用 vscode 的时候输中文连接比较方便。还有就是 Windows 下也一样很方便。主要是管理的服务器太多了...
|
12
Yadomin 246 天前 6
|
14
mritd 246 天前 via iPhone
学到了😂
|
15
GoodRui OP @Yadomin 感谢老哥提供思路,尝试了下确实是这个问题,以下是 openssh 的更新记录,高亮部分提到的应该是影响 hostname 中含中文的情况:
使用 homebrew 安装了 9.5p1 版本的 openssh ,恢复正常。 感觉这个改动影响挺大的,包括 Reddit 上也有老外反馈,使用 `a human readable Host like "Web Host A - Client Name"` 这种的也不行了。 哎不知道以后咋搞。 |
16
march1993 244 天前
提 issue 吧,毕竟域名里可以有中文,hostname 就不能有中文了?
|
18
march1993 242 天前
@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"); } ``` |