〜/ .ssh / config中定义的主机的制表符补全在优胜美地上不再起作用


38

我正在尝试创建~/.ssh/config文件以简化服务器连接上的工作。

在Mavericks中,所有功能都可以正常使用,tab并且可以使用以下文件自动完成主机名:

Host test-host-name
    HostName 192.168.1.2
    User root

优胜美地上的相同配置具有不同的行为。当我ssh t在外壳上键入时,tab不会自动完成主机名。

有人知道优胜美地是否有所更改,现在我需要做一些事情才能使其生效?

Answers:


37

您可以bash-completion通过brew安装来启用bash shell完成:

brew install bash-completion

然后将以下内容添加到您的~/.bash_profile

if [ -f $(brew --prefix)/etc/bash_completion ]; then
. $(brew --prefix)/etc/bash_completion
fi

资源

(编辑:brew tap homebrew/completions自2018年起不推荐使用。)


+1 :)在安装bash-completion-1.3.3.high_sierra时,它告诉我应该添加[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion。您能详细说明应该使用哪个版本(或您的哪个版本),为什么?
Jan Nash

15

我认为您Mac的外壳是bash。

您需要完成ssh命令,有关更多详细信息,请阅读 man complete

_complete_ssh_hosts ()
{
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        comp_ssh_hosts=`cat ~/.ssh/known_hosts | \
                        cut -f 1 -d ' ' | \
                        sed -e s/,.*//g | \
                        grep -v ^# | \
                        uniq | \
                        grep -v "\[" ;
                cat ~/.ssh/config | \
                        grep "^Host " | \
                        awk '{print $2}'
                `
        COMPREPLY=( $(compgen -W "${comp_ssh_hosts}" -- $cur))
        return 0
}
complete -F _complete_ssh_hosts ssh

别忘了您需要source文件来获取要在终端中加载的新命令。或者您可以将此代码放在.bash_profile中


是的,外壳是bash。为什么在Maveriks中我不需要这样做?
RikyTres

不,我刚刚测试过。默认情况下,我无法在Mavericks中做到这一点。
尼尔森

comp_ssh_hosts=$(awk -F , 'FNR== NR && ! /^#|\[/ {field = $1} FNR != NR && /^Host / {field = $2} {hosts[field]} END {for (host in hosts) {print host}' "$HOME/.ssh/known hosts" "$HOME/.ssh/config")
暂停,直到另行通知。

2

来自MacWorld上的这篇文章

将以下内容复制/粘贴到~/.bash_profile

complete -o default -o nospace -W "$(/usr/bin/env ruby -ne 'puts $_.split(/[,\s]+/)[1..-1].reject{|host| host.match(/\*|\?/)} if $_.match(/^\s*Host\s+/);' < $HOME/.ssh/config)" scp sftp ssh

然后,您需要重新启动终端或键入source ~/.bash_profile(请注意,后者仅在您当前的选项卡中有效)。


没有为我工作。但是apple.stackexchange.com/a/168168/136365做到了。我认为最好避免依赖于红宝石这样的事情。
Ben Creasy

0

仅供参考,我不确定如何直接响应nelson的答案,因为我尚未建立足够的声誉以对其进行评论,但是在运行El Capitan的计算机上^M,该文件已附加到配置文件中的所有主机名中。我必须将其添加\r$IFS变量中,或者\r从第二个输出中删除/替换所有实例cat。最后,通过添加tr '\r' '\n'使该命令链如下所示,我完成了后者:

cat ~/.ssh/config | \
        grep "^Host " | \
        awk '{print $2}' | \
        tr '\r' '\n'

-1

您可以在/ etc / hosts中添加条目,并在主机名自动完成中使用它们:

"ssh @" + [TAB]

系统需要重新启动才能重新加载此文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.