web-dev-qa-db-ja.com

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

私はいつもsshにいつもアクセスしているサーバーの大きなリストを持っています。ホスト名のリストを保持できるようにbashまたはzshを使用する方法はありますか。bashのオートコンプリートはファイル内を移動し、入力するたびにこれらの文字で始まるボックスの候補を表示しますホスト名の最初の数文字。

8
pradeepchhetri

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
8
kwarrick

bash completion パッケージには、以下を含むsshコマンドの補完が含まれます。

  • ssh
  • ssh-add
  • ssh-copy-id
  • sshfs

ここでソースを閲覧できます: https://alioth.debian.org/scm/browser.php?group_id=100114

9
jasonwryan

unix.SE での自分の回答からコピー:

Ubuntuホストを使用している場合は、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 | 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

6
dotancohen

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

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

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

0
Gilles Quenot