(我问过关于zsh的这个问题 ,但是我也使用了bash,并且在那里也会发现它有用,因为bash比zsh拥有更多的用户,所以我猜测其他许多人也是如此。
我想在bash上设置命令完成来显示主机名称
ssh [TAB]
从我的.ssh / config文件(最好从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