使用zsh对大型/.ssh/config文件进行自动完成速度慢

4

我目前有一个 /.ssh/config 文件,其中大约有7000行。

我正在尝试看是否有办法加速zsh中的自动完成功能。

当我开始输入我想要 ssh 进入的服务器名称,然后按 TAB 键时,需要大约10秒才会显示可以选择的主机列表。


不太有帮助的答案是重新定义/usr/share/zsh/*/functions/_ssh中找到的_ssh_hosts函数。它本质上很慢:它逐行读取您的文件,查找“Host”指令并编译结果。最大的问题是它没有缓存第一次发现的主机名(对于小文件来说是合理的,因为这意味着不必实现检测文件何时被修改以使缓存无效的逻辑)。 - chepner
1
这个答案提供了一种重新定义完成方式的方法,可以使其更快:https://dev59.com/M7joa4cB1Zd3GeqPGudD#64147638 - dshepherd
1个回答

1
问题在于_ssh的自动完成每次尝试自动完成主机时都会逐行读取您的整个配置文件,查找Host指令。
一种解决方法是重写相关函数(_ssh_hosts)以执行更快的操作(例如,在内存中缓存主机名以供后续完成)。
另一种方法是通过将实际配置移入单独的文件中,使配置文件变小,只留下Host/Include对的列表。例如,转换为:
Host foo
    User bob
    IdentityFile ~/.ssh/bob_ident

Host bar
    User alice
    IdentityFile ~/.ssh/alice_ident

转换为

Host foo
    Include foo_config

Host bar
    Include bar_config

在这里,~/.ssh/foo_config~/.ssh/bar_config将包含每个主机的相关细节。

可以想象,Host指令只占据了您7000多行代码中的一小部分,因此这应该会显著加快_ssh_host的速度。


有人尝试过这个吗?它产生了显著的影响吗? - Chris
我测试了一下,但对我没有帮助——似乎在自动完成时会拉取包含文件,因此速度仍然很慢。(SSH 8.4,ZSH 5.8) - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接