〜/ .ssh / configで定義されたホストのタブ補完がYosemiteで機能しなくなりました


38

~/.ssh/configサーバー接続での作業を簡素化するためにファイルを作成しようとしています。

Mavericksではすべてが正常に機能し、tab次のようなファイルでホスト名を自動補完することができました:

Host test-host-name
    HostName 192.168.1.2
    User root

Yosemite上の同じ構成では、動作が異なります。私が入力するとssh t、シェル上でtabホスト名を自動補完しません。

誰かがヨセミテで何かが変更されたかどうかを知っていますか、今はそれを機能させるために何かをする必要がありますか?

回答:


37

brewbash-completion介してインストールすることにより、bashシェル補完を有効にできます。

brew install bash-completion

次に、以下を追加します~/.bash_profile

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

ソース

(編集:brew tap homebrew/completions2018で非推奨になりました。)


+1 :) bash-completion-1.3.3.high_sierraをインストールするときに、を追加する必要があると表示され[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completionます。どのバージョン(またはそのバージョン)を優先すべきか、そしてその理由を詳しく説明してください。
ヤンナッシュ

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そうでした。このようなことをルビーに頼ることは避けるのが最善だと思います。
ベンクリーシー

0

参考までに、ネルソンの回答に直接応答する方法はわかりません。まだコメントするほどの評判を築いていませんが、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]

システムがこのファイルをリロードするには、再起動が必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.