SSHおよびSCPの自動補完サーバー名


61

私はいくつかのサーバーが中に設定されている~/.ssh/configような、alphabeta。コマンドssh al<tab>scp file.tgz al<tab>構成済みサーバーの名前をオートコンプリートするようにBashを構成するにはどうすればよいですか?

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


2
ディストリビューション用にbash-completionsパッケージをインストールしていますか?zshと混同するかもしれませんが、これは標準の完了ルーチンの一部だと思います。
カレブ14年

私のインストールはまさにこれを行います。
slm

これはKubuntu 12.10にあり、bash-completionインストール済みです。
dotancohen

回答:


64

それを見つけた!!

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に感謝します!


1
〜/ .ssh / known_hostsのCentos 6エントリでは、〜/ .ssh / configのエントリが上書きされるようです。foo.bar.baz.comがknown_hostsにある場合、「ssh foo」<tab>を実行すると全体に一致します。これは、ssh confgから適用する別のユーザーまたは他の設定がある場合は望ましくありません。適切に自動補完されないエントリがssh configにある場合は、known_hostsに存在するかどうかを確認して削除します。これで、設定から設定を取得して通常どおり動作するはずです。
イムラン英国

@ Imran-UK:Ubuntuはセキュリティを装って賢明なことをしないことが知られています。どうやら、悪意のあるエンティティは、ディレクトリ上でchmod 0600にもかかわらず、ユーザーとして〜/ .ssh / configを編集する可能性があると思われます。ねえ、私は決定を下した人ではなかった!
-dotancohen

1
私はzshとoh-my-zshを使用していますが、〜/ .ssh / configに "ssh"プラグインを有効にして "HashKnownHosts yes"を入れると正しいことをしているように見えます。ディストリビューションに関係なくシェルを変更できるため、これを回避する方法があります。
イムラン英国

@ Imran-UK:実際、私は過去にzshを試しましたが、もう一度試してみるつもりです。それについて見ていきます。友達のシュクラン!
dotancohen

私はパーティーに少し遅れていることを知っていますが、RHEL 7はにあるエントリをオートコンプリートし/etc/hosts、他のディストリビューションでも同じことができます。
Centimane

16

事前パッケージ

どのディストリビューションを使用しているかはわかりませんが、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既にパッケージ化されている完了規則ファイルが見つからない場合は、ファイルを使用して同様のことができます。


ありがとうございました。Ubuntuにはが付属していないようです/usr/share/bash-completion/completions/ssh。そのファイル全体をどこかに投稿して、コピーすることはできますか?ありがとう!
dotancohen

このアーカイブからすべてのファイルを取得できます。pkgs.fedoraproject.org
slm

大変申し訳ありませんが、そのtarアーカイブからsshファイルをコピーしても解決し/usr/share/bash-completion/completions/sshません!どちらもcomplete -W ...Bashプロンプトからコマンドを実行しません。ここで何が問題なのでしょうか?
dotancohen

ありがとうございました。これは、Ubuntuの設計上の決定事項として知られています。したがって、私は、sshまたはのために働いてbash完成を得ることができなくても、答えを受け入れていますscp
dotancohen

2
OSXのHomebrewにも次の機能があります。bash完了とzsh完了
Adam Nelson 14年

7

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

Host *
    HashKnownHosts no

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


ありがとうございました。実際に~/.ssh/config、このディレクティブをに既に追加し、でディレクティブを変更し/etc/ssh/ssh_config~/.ssh/known_hostsファイルを削除しました。サーバーに再度ログインした後、ホスト名はハッシュされたまま保存されています。
-dotancohen

回答を編集しました。ホストを指定し、ハッシュディレクティブを内部にネストする必要があります。多くの.ssh/configファイルがすでにこの行を持っているので、私はリストしませんでした。それが機能するかどうか教えてください。
M1ke

これは間違いなく簡単な方法です!(新しいバージョンの)Ubuntuでssh補完が有効になっていることを考えると、これはおそらく望まれていることです。
ジョンモンゴメリー

以下で追加したように、これを行うことはできますが、おそらくそうすべきではありません-とにかく完了させるために必要はありません。ただし、同意せず、上記の追加後に既存のホストのハッシュを解除したい場合は、rm〜/ .ssh / known_hostsを実行するだけで、いつでも再生成(ハッシュなし)できます新しいサーバーにログインします。
ジェイミーソンベッカー

3

DebianおよびUbuntuでsshオートコンプリートを有効にするには:

sudo apt-get install bash-completion

これは、上記で説明した内容および元の質問とは反対に、known_hostsハッシュとはまったく関係ないことに注意してください。known_hostsからオートコンプリートする場合は、もちろんハッシュを無効にする必要がありますが、これは強くお勧めしません。

たとえば、私は持っています:

Host *
    HashKnownHosts yes

.ssh / configで、.ssh / configおよび/ etc / hostsにリストされているホストに対してssh自動補完が正常に機能しています。OPが述べているように、ホストを.ssh / configに追加する必要があります。

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

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

次に、入力するだけで、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自動補完を有効にしますから~/.ssh/config/etc/hostsなど

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

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

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


2

Ubuntu 14.04では、ssh記載されているサーバーを自動補完します~/.ssh/config

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

質問していた人のエントリは次のとおりです。

HOST server-name 
    GSSAPIAuthentication=no

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


ノアありがとう、そのエントリーは何でしたか?14.04および14.10システムでは、オートコンプリートが機能しません。
-dotancohen

エントリは重要ではないと思います-そこにあるだけだと確信していますが、エントリを回答に追加します。
ノア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.