SSHおよびSCPのオートコンプリートサーバー名

SSHおよびSCPのオートコンプリートサーバー名

一部のサーバーを構成しました。~/.ssh/configalphaのようなbeta。構成されたサーバーの名前をコマンドし、オートコンプリートするようにBashをどのように構成しますか?$ ssh alTab$ scp file.tgz alTab

サーバーを追加したくありません。その他サーバーを定期的に追加および削除し、リストがかなり大きいため、一度に1つのファイル(Bash配列など)が追加されます。

これはKubuntu 12.10にあり、私は持っていますバッシュ完了インストールする。

答え1

それを発見! !

Ubuntuの下にあるようですのエントリがハッシュされ~/.ssh/known_hostsました。そのため、SSH完了では読み取れません。これはバグではなく機能です。を追加してもホストハッシュを防ぐことはできHashKnownHosts noません。~/.ssh/config/etc/ssh/ssh_config

ところで、私が興味を持っているホストはでも見つかります~/.ssh/config。以下は、このファイルからエントリを読み取るBash完了スクリプトです。

_ssh() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts=$(grep '^Host' ~/.ssh/config ~/.ssh/config.d/* 2>/dev/null | grep -v '[?*]' | cut -d ' ' -f 2-)

    COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
    return 0
}
complete -F _ssh ssh

そのスクリプトを挿入し、/etc/bash_completion.d/ssh次のようにインポートします。

$ . /etc/bash_completion.d/ssh

私が見つけたこのガイドArchive.orgのコピー)は非常に貴重であり、それなしではこのスクリプトを書くことはできません。ありがとうスティーブ・ケンプ素晴らしいガイドを書いてくれてありがとう!

答え2

事前梱包

どのディストリビューションを使用しているかはわかりませんでしたが、私のFedora 19システムには、bash-completionこのコンプリートルールファイルを介してこの機能を提供する次のパッケージがインストールされています。

/usr/share/bash-completion/completions/ssh

私がインストールしたパッケージは次のとおりです。

$ rpm -aq |grep completion
bash-completion-2.1-2.fc19.noarch

ルールファイルを見ると、$HOME/.ssh/configファイルについて尋ねるセクションが表示されます。

$ grep config /usr/share/bash-completion/completions/ssh
    local configfile
    local -a config
        # Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
        _known_hosts_real -a -F "$configfile" "$cur"
    local configfile
        # Search COMP_WORDS for '-F configfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
        _known_hosts_real -a -F "$configfile" "$cur"
    local configfile prefix
        # Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
                _known_hosts_real -c -a -F "$configfile" "$cur"

自分を転がしてください。

私もこのポイントを見つけました。Known_hosts_autocomplete.sh$HOME/.ssh/known_hostsファイルを除いて同様の操作を行います。

# add to ~/.bash_profile, and close/reopen a shell.  Will autocomplete any
# hosts found in known_hosts.

complete -W "$(echo `cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | \
    sed -e s/,.*//g | uniq | grep -v "\["`;)" ssh

$HOME/.ssh/config何らかの理由でssh事前パッケージ化された完了ルールファイルが見つからない場合は、同様の操作を実行できます。

答え3

Ubuntuが既知のホストをハッシュするため、オートコンプリートが機能しないことがわかりました。追加できます

Host *
    HashKnownHosts no

ファイルに保存され.ssh/configますが、既存のホストはハッシュされません。

答え4

Ubuntu 14.04では、ssh前述のサーバーを自動補完します。~/.ssh/config

私が定期的に訪問しているサーバーの1つだけが自動的に実行されていることに気づいたとき、私はこれを実現しました。 2 つの唯一の違いは、SSH 構成ファイルの認証関連項目です。また、他のサーバーの構成ファイルに新しいエントリを追加すると、自動的に完了し始めました。

質問された方のための項目は次のとおりです。

HOST server-name 
    GSSAPIAuthentication=no

構成で指定した内容が重要であれば(もちろんまだ有効な限り)、非常に驚​​くでしょう。

関連情報