ssh_configに設定したホスト名をTABで補完できるようにする

ssh_config を使うことでsshの接続先毎にキーやデフォルトユーザーを設定できて便利なのですが、ホストが増えてくると「あれ?このサーバーなんて名前で設定したっけ?」となりがちです。

命名規則を決めたりして覚えやすくするのもいいのですが、自分はそんなヒューマンスキル高くないのでスクリプトでカバーします。 sshコマンドでホスト名の補完がきけばいいのですが、sshコマンドをそのまま使いたいときに不便なので、 今回はsshc(completeの略で…)というエイリアスを作成して sshc でホスト名が羅列されるようにします。

エイリアスを作成するのでついでに-Fオプションを付けてconfigファイルの指定もつけておきます。

~/.ssh/complete

#!/bin/bash
_ssh_list(){
  OLDIFS=$IFS
  IFS=$'\n'
  OUT=""
  for ITEM in `grep "Host " ~/.ssh/config | sed -e "s/ \+/ /g" |cut -f2 -d" "`
  do
    OUT="${ITEM} ${OUT}"
  done
  IFS=$OLDIFS
  echo ${OUT}
}   

_ssh_comp() {
  local cur
  cur=${COMP_WORDS[COMP_CWORD]} 
  if (( $COMP_CWORD <= 1 )); then
    COMPREPLY=($( compgen -W "`_ssh_list`" -- $cur ))
  else
    COMPREPLY=() 
  fi
}

alias sshc="ssh -F ~/.ssh/config"
complete -o bashdefault -F _ssh_comp sshc

~/.bash_profile

#一行追加
source ~/.ssh/complete

これでssh_config を設定しておけば sshc ${hostname} で指定のホストにシェルアクセスできるようになり、hostname部分はタブで補完が効くようになります。