web-dev-qa-db-ja.com

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

いくつかのサーバーを~/.ssh/configalphabetaなど。コマンドssh al<tab>およびscp file.tgz al<tab>構成済みサーバーの名前をオートコンプリートしますか?

サーバーを定期的に追加および削除し、リストが非常に大きいため、サーバーが追加されるたびにanotherファイル(つまり、Bash配列)にサーバーを追加したくありません。

67
dotancohen

見つけた!!

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

ただし、私が興味を持っているホストは~/.ssh/configにもあります。次に、そのファイルからエントリを読み取るBash Completionのスクリプトを示します。

_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

私は このガイド が非常に貴重であることを発見しました。ありがとう Steve Kemp そのすばらしいガイドを書いてくれてありがとう!

72
dotancohen

パッケージ済み

どのディストリビューションを使用しているかは言いませんが、私の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

何らかの理由でsshの完了ルールファイルが既にパッケージ化されていない場合は、$HOME/.ssh/configファイルを使用して同様のことを行うことができます。

16
slm

Ubuntuが既知のホストをハッシュするため、オートコンプリートが機能していないことがわかりました。あなたは付け加えられます

Host *
    HashKnownHosts no

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

9
M1ke

DebianとUbuntuでssh自動補完を有効にするには:

Sudo apt-get install bash-completion

これには何もする必要がないがあり、known_hostsハッシュを使用することに注意してください。これは、上記の説明と元の質問とは異なります。 known_hostsからオートコンプリートする場合は、もちろんハッシュを無効にする必要がありますが、これはstronglyに対して推奨されません。

たとえば、私は:

Host *
    HashKnownHosts yes

私の.ssh/configにありますが、.ssh/configおよび/ etc/hostsにリストされているホストに対して、sshのオートコンプリートがうまく機能しています。 OPが述べているように、ホストを.ssh/configに追加する必要があります。

ホストmy-awesome-Hostホスト名the.real.Host.name

(または、Debian/Ubuntuスクリプトの別のソースである/ etc/hostsにHostエントリーを追加できます。)

次に、ssh my-awe<tab>と入力するだけで、自動的に完了します。繰り返しますが、これはHashKnownHostsの場合でも同様です。 (bashシェルでbash補完を有効にする必要があり、ディストリビューション用に上記のようにこれらのスクリプトを具体的にインストールする必要があることに注意してください。)

次に、これらの行を.bashrcに追加して有効にします(ログアウトして再度ログインするか、新しいbashを入力して新しいシェルを起動するだけです(有効にする必要はありません)。 /etc/bash.bashrcおよび/etc/profileソース/etc/bash.bashrc)ですでに有効になっている場合)。

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

これにより、~/.ssh/config/etc/hostsなどからのsshオートコンプリートが有効になります。

Debianのデフォルトはbashではなくashであることに注意してください。簡単にbashに切り替えることができます:

Sudo usermod -s /bin/bash "$USER"

(これを有効にするには、ログアウトしてから再度ログインする必要があります。)

5
Jamieson Becker

Ubuntu 14.04では、sshは、~/.ssh/config

私がよくアクセスするサーバーの1つだけがオートコンプリートにアクセスしていることに気付いたとき、私はそれに気付きました。 2つの唯一の違いは、認証に関連するssh構成ファイルのエントリでした。他のサーバーの構成ファイルに新しいエントリを追加すると、オートコンプリートも開始されました。

これは尋ねていた人々のためのエントリーです:

Host server-name 
    GSSAPIAuthentication=no

(もちろん、まだ有効である限り)configで何を指定しているかが重要であるとしたら、私は非常に驚きます。

3
Noah