如何在 zsh 上编辑 ssh 的命令完成?

ico*_*ast 13 ssh shell command-line-interface zsh

我想在 zsh 上设置命令完成以在键入后显示主机名

ssh [TAB]
Run Code Online (Sandbox Code Playgroud)

从我的 .ssh/config 文件中取出名称(最好是从 known_hosts 和 /etc/hosts 以及任何其他有意义的地方)并呈现一个列表。

它目前做了一些这样的事情,但是

  1. 它根本不使用 .ssh/config
  2. 它首先需要一个用户名,即使使用 .ssh/config 不需要输入用户名
  3. 它提供了多个列表(可能一个来自known_hosts,另一个来自/etc/hosts,但我还没有验证过)

所以我想在输入 ssh [TAB] 后在(最好是单个)列表中包含已知的用户名和已知的主机名

(我在 Google 之前来到这里是因为 1)它会导致答案被存储在这里,并且 2)它可能更有效。如果没有其他人回答,我会寻找答案。)

Gil*_*il' 17

这是我的.zshrc. 它自 2002 年以来一直没有改变,所以我今天可能会以不同的方式编写它,但它仍然可以从~/.ssh/configand完成主机名~/.ssh/known_hosts(如果HashKnownHosts关闭 - 在那些日子里它不存在)。

h=()
if [[ -r ~/.ssh/config ]]; then
  h=($h ${${${(@M)${(f)"$(cat ~/.ssh/config)"}:#Host *}#Host }:#*[*?]*})
fi
if [[ -r ~/.ssh/known_hosts ]]; then
  h=($h ${${${(f)"$(cat ~/.ssh/known_hosts{,2} || true)"}%%\ *}%%,*}) 2>/dev/null
fi
if [[ $#h -gt 0 ]]; then
  zstyle ':completion:*:ssh:*' hosts $h
  zstyle ':completion:*:slogin:*' hosts $h
fi
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,只需将 `zstyle ':completion:*:ssh:*' hosts` 添加到我的 `.zshrc` 就解决了这个问题。你可以通过运行 `zstyle -b ':completion:*:ssh:*' hosts bool 来检查这是否完成;回声 $bool`。 (3认同)