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

(我问过关于zsh的这个问题 ,但是我也使用了bash,并且在那里也会发现它有用,因为bash比zsh拥有更多的用户,所以我猜测其他许多人也是如此。

我想在bash上设置命令完成来显示主机名称

ssh [TAB] 

从我的.ssh / config文件(最好从known_hosts和/ etc / hosts以及其他任何有意义的地方)中提取名称,然后显示一个列表。

它目前做了一些,但是

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

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

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

前一段我写了这个两部分指南:

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

它解释了如何编写完成脚本 – 虽然以前的答案表明你想要的东西应该已经提供给你。

这个function已经由bash完成提供了。 如果你想编辑它的function,实际的文件是/etc/bash_completion.d/ssh

这是由包完成提供的

在键入ssh <TAB>时,它将列出/ etc / hosts和〜/ .ssh / config中的所有主机在一个列表中。

如果您为给定主机指定了用户,则在使用ssh时不需要指定此用户。

所以,如果你想SSH服务器布兰登

inputssh br <TAB>,只要该主机位于/ etc / hosts或〜/ .ssh / config中,就应该自动完成brandon这个单词。

这是我在我的.bashrc ssh主机名完成:

 SSH_COMPLETE=( $(cut -f1 -d' ' ~/.ssh/known_hosts |\ tr ',' '\n' |\ sort -u |\ grep -e '[:alpha:]') ) complete -o default -W "${SSH_COMPLETE[*]}" ssh 

如果你在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正在谈论的包/function。

如果你在Ubuntu服务器上,那么你应该知道在Ubuntu 中~/.ssh/known_hosts中的条目是散列化的 ,所以SSH完成不能读取它们。 Canonical开发者认为这是一个function,而不是一个错误。 即使通过添加HashKnownHosts no ~/.ssh/config/etc/ssh/ssh_config我无法阻止主机散列。

但是,您可以从~/.ssh/config读取未经过散列处理的已configuration条目。 基于史蒂夫·肯普的答案 的链接 ,这里是一个Bash完成的脚本,从该文件读取条目:

 _ssh() { local cur prev opts COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" opts=$(grep '^Host' ~/.ssh/config | awk '{print $2}') COMPREPLY=( $(compgen -W "$opts" -- ${cur}) ) return 0 } complete -F _ssh ssh 

将该脚本放在/etc/bash_completion.d/ssh ,然后使用以下命令获取它:

 $ . /etc/bash_completion.d/ssh