Ssh

如何在 zsh 上編輯 ssh 的命令完成?

  • July 19, 2021

我想在 zsh 上設置命令完成以在我鍵入後顯示主機名

ssh [TAB]

從我的 .ssh/config 文件中取出名稱(最好從 known_hosts 和 /etc/hosts 以及其他任何有意義的地方)並呈現一個列表。

它目前做了一些這樣的事情,但是

  1. 它根本不使用 .ssh/config
  2. 它首先需要一個使用者名,即使使用 .ssh/config 不需要輸入使用者名
  3. 它顯示了多個列表(可能一個來自 known_hosts,另一個來自 /etc/hosts,但我尚未驗證)

所以我想在輸入 ssh 後在(最好是單個)列表中包含已知的使用者名和已知的主機名

$$ TAB $$ (我在Google之前來到這裡是因為 1)它會導致答案儲存在這裡,並且 2)它可能更有效。如果沒有其他人回答,我會尋找答案。)

這是我的相關部分.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

引用自:https://serverfault.com/questions/170346