LoginSignup
3
3

More than 5 years have passed since last update.

bash-completionを使用したsshのホスト名を自動補完

Posted at

実現したいこと

bashコマンドの補完を強化してくるbash-completionを使用して、
独自に作成したスクリプトの実行結果(IPアドレスとホスト名のリスト)を読み込んで、sshのホスト名自動補完を実現したい。
sshのホスト名自動補完では、デフォルトでは/etc/hosts~.ssh/config~/.ssh/known_hostsが読み込まれるようだが、
ここに独自スクリプトの実行結果の読み込まれるようにしたい。
今回は、PowerDNSの全レコードをAPIを使用して取得し、その結果を用いてsshのホスト名自動補完を実現する。

環境

CentOS 6.4
bash-completion 1.3-5

インストール方法

## バージョン確認
$ rpm -qa | grep bash-completion
bash-completion-1.3-5.el6.noarch

## epelリポジトリを有効にするしてからインストールする。
$ sudo yum install bash-completion

やったこと

当初どのようにやろうかと迷っていたら、
似たようなことを既に実現した方がいらしたので、そちらをそのまま試してみることに。
参考:consul membersの結果でbash補完する

上記ページを見ると、_known_hosts_real()の中身をごっそり書き換えた
今回は、/etc/bash_completionに追記する形で対応した。

_known_hosts_real()
{
    local pdns_list=$(pdns-cli list)
    COMPREPLY=( $( \
        compgen -W "$pdns_list" \
        ${COMP_WORDS[COMP_CWORD]} \
    ))

    return 0
}

上記はpdns-cliスクリプト(自家製)の実行結果を最終的に「COMPREPLY」という配列に値を入れています。
ただし、「COMPREPLY」にいれるだけだと、sshでタブ補完しようとした際、関係のない全ホスト名が候補として表示されてします。
そこでcompgenコマンドで入力した文字にマッチするものだけを表示するよう処理をしています。
この辺で実行しているコマンドの解説は以下のページが参考になりました。
参考:Bashの補完について

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3