V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
GoodRui
V2EX  ›  macOS

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

  •  
  •   GoodRui · 65 天前 · 1606 次点击
    这是一个创建于 65 天前的主题,其中的信息可能已经有所发展或是发生改变。

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


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



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



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

    哎不知道以后咋搞。
    march1993
        16
    march1993  
       63 天前
    提 issue 吧,毕竟域名里可以有中文,hostname 就不能有中文了?
    GoodRui
        17
    GoodRui  
    OP
       63 天前
    @march1993 貌似提不了 issue 呢,官方的公告说了这是为了修复漏洞,不光是中文字符,连一些字符比如空格都给禁用了,估计不好办。
    march1993
        18
    march1993  
       61 天前
    @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
        19
    GoodRui  
    OP
       61 天前
    @march1993 不过这个我确实换了 9.5p1 版本的 openssh 就可以了,而且 9.6p1 版本的 release 里面确实有提到这个。Reddit 上也有关于这个的讨论。
    更深的原理就不懂了,能用就行了...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1017 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 21:22 · PVG 05:22 · LAX 14:22 · JFK 17:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.