異なるホストにSSH接続するためのBashオートコンプリート機能


8

私はいつもいつも利用しているサーバーの大きなリストを持っsshています。使用してどのような方法があるbashか、zsh私はホスト名とbashの自動補完のリストを保つことができるように、ファイルを通過し、私がホスト名の最初の数文字を入力するたびにこれらの文字で始まるボックスの示唆を与えます。

回答:


8

Zsh補完は、いわゆるsshブックマークで機能します。これらは、のホスト構成ごとです~/.ssh/config

例えば、

  host baz
    hostname 192.168.1.2
    port 22
    user warrick

  host bar
    hostname example.com
    port 2200
    user kevin
    identityfile /home/warrick/.ssh/ec2.pem

man ssh_config オプションの完全なリストを表示します。

編集

私はohmyzshの完了スクリプトを使用しています:

https://raw.github.com/robbyrussell/oh-my-zsh/master/lib/completion.zsh

と同様のスタイルでohmyzsh、上のスクリプトをに配置して~/.zsh/libs/completion.zshこれをに追加しました~/.zshrc

# ~/.zshrc
for f in ~/.zsh/libs/*; do
  source $f
done

私はzshではなくbashを使用しています...
Gilles Quenot

そうです、OPの質問はbashまたはzshに関するものです。あなたの投稿に対する私のコメントは、可能な限り〜/ .ssh / configを/ etc / hostsに優先させることでした。
kwarrick


6

unix.SEに関する自分の回答からコピー:

Ubuntuホストを使用している場合は、Ubuntuではのエントリ~/.ssh/known_hostsがハッシュ化されているため、SSH完了でエントリを読み取ることができないことを知っておく必要があります。これはバグではなく機能です。でも追加することによって、HashKnownHosts no~/.ssh/configし、/etc/ssh/ssh_configIホストハッシュを防ぐことができませんでした。

ただし、~/.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 | awk '{print $2}')

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

そのスクリプトを配置/etc/bash_completion.d/sshし、次のコマンドを使用してソースを指定します。

$ . /etc/bash_completion.d/ssh

私が見つかりました。このガイドは、非常に貴重な、私はこのそれなしでスクリプトにできなかったでしょう。その素晴らしいガイドを書いてくれたSteve Kempに感謝します!


2
1しかし、私はawkのラインに代わるopts=$(grep '^Host' ~/.ssh/config | sed 's@^Host @@')ので、~/.ssh/config構文は1行に複数の名前が可能になります
nhed

@nhed:ありがとう!それが許されるとは知りませんでした。
dotancohen

0

これを機能させるには、完了させたいホストを/etc/hostsファイルに入れます。

bash-completionパッケージも必要です(ファイル/ etc / bash_completionおよびディレクトリ/etc/bash_completion.dを含む)

そして、それを〜/ .bashrcにソースします(. /etc/bash_completion- / etc/bash.bashrcまたは〜/ .bashrcでコメントアウトされている場合があります)。


4
/ etc / hostsを使用しないことをお勧めします。代わりに、いわゆるsshブックマークを〜/ .ssh / configに追加します。man ssh_config詳細については、これははるかに用途が広いため、複数のエイリアス、ユーザー名、ポートなどを指定できます。
kwarrick 2012年

archlinuxでは、に何かを入れたときに/etc/ssh/ssh_config、構成されたホストに対して完全に機能しません。
Gilles Quenot

私の拡張回答を参照してくださいohmyzsh。私はからの補完を使用しています。
kwarrick

1
あなたが見れば、ソース、次のように表示されます、そのスクリプトのチェックknown_hostsだけでなく、他の設定ファイル、例えば、。~/.ssh/config
jasonwryan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.