(我有问了有关 zsh 的这个问题但是我也使用 bash 并且发现它在那里也很有用——我猜很多人也会这么认为,因为 bash 比 zsh 拥有更多的用户。)
我想在 bash 上设置命令完成,以便在输入后显示主机名
ssh [TAB]
从我的 .ssh/config 文件中取出名称(最好是从 known_hosts 和 /etc/hosts 以及其他有意义的地方取出)并提供一个列表。
目前它已经实现了部分功能,但是
- 它根本不使用 .ssh/config
- 它首先需要输入用户名,尽管使用 .ssh/config 就不需要输入用户名了
- 它提供了多个列表(可能一个来自known_hosts,另一个来自/etc/hosts,但我还没有验证)
因此,我希望在输入 ssh [TAB] 后在(最好是单个)列表中包含已知用户名以及已知主机名
(我先来这里,然后才使用 Google,因为 1)这样答案就会存储在这里,2)这样可能效率更高。如果没有其他人回答,我会寻找答案。)
答案1
不久前我写了这个由两部分组成的指南:
http://www.debian-administration.org/article/316/An_introduction_to_bash_completion_part_1
http://www.debian-administration.org/article/317/An_introduction_to_bash_completion_part_2
它解释了如何编写完成脚本 - 尽管前面的答案表明了你想要什么应该已经可供您使用。
答案2
这是我在.bashrc
ssh 主机名补全中所包含的内容:
SSH_COMPLETE=( $(cut -f1 -d' ' ~/.ssh/known_hosts |\
tr ',' '\n' |\
sort -u |\
grep -e '[:alpha:]') )
complete -o default -W "${SSH_COMPLETE[*]}" ssh
答案3
bash 补全已经提供了此功能。如果你想编辑其功能,实际文件是/etc/bash_completion.d/ssh。
这是由包提供的bash 完成。
输入 ssh < TAB > 时,它将在一个列表中列出 /etc/hosts 和 ~/.ssh/config 中的所有主机。
如果您已经为给定主机指定了用户,则在使用 ssh 时无需指定该用户。
因此,如果你想 ssh 到服务器 brandon
输入 ssh br< TAB >,只要该主机位于 /etc/hosts 或 ~/.ssh/config 中,它就会自动完成单词 brandon。
答案4
如果你使用的是 Mac,则可以使用 Homebrew 来安装 bash-completion:
brew install bash-completion
将以下内容添加到
~/.bash_profile
if [ -f /usr/local/etc/bash_completion ]; then
. /usr/local/etc/bash_completion
fi
如果你已经使用 MacPorts 安装了 bash-completion,请将其添加到 bash_profile 中
if [ -f /opt/local/etc/bash_completion ]; then
. /opt/local/etc/bash_completion
fi
现在您有了 Richard Holloway 所谈论的包/功能。