LoginSignup
2
0

More than 3 years have passed since last update.

shellscriptを使って、sshの引数にtab補完を効かせる

Last updated at Posted at 2018-07-29

ぶっちゃけ上の記事で全部事足ります。少し難しいけど。

やりたいこと

自分の環境を晒すわけにもいかないので、例えの話。

ip: 192.168.0.1のホスト[hogehost]と、
ip: 192.168.4.2のホスト[hugahost]があるとします。

いちいち ssh username@192.168.0.1と打つのは面倒です。
ssh hogehostと打ったら、勝手にssh username@192.168.0.1とコマンドを発行してほしい!!!

これに関しては、.ssh/configというファイルを設定することで達成することができました。
詳しくは検索してみてくださいね。
https://webkaru.net/linux/ssh-config-file/
この記事、簡潔でわかりやすかったですね。

さて、次は、、、

ssh <tab>と打った時に、host名で補完を効かせたい!

ssh <tab>
 hogehosy hugahost

ずばりこうしたい!!

どうやるか

-> 説明要らない人はこっち

せっかく.ssh/configを作ったので、これを使いましょう。
うれしいことに、きれいな規則に沿って並んでくれてます。

先ほどの記事の一部を引用すると

#Aサーバー
Host sakura
HostName aaa.bbb.ccc.ddd
Port 22
User root

これですね。

この例で言うと、 'sakura'の部分が欲しいです。.ssh/configのおかげで、
ssh sakuraと打つとssh root@aaa.bbb.ccc.ddd:22と発行してくれます。

では、まずgrepで'^Host 'とついてる行を抜き出しちゃいましょう。
grep '^Host ' ~/.ssh/config
そして、その結果をawkコマンドで出力します。
grep '^Host ' ~/.ssh/config | awk '{print $2}'

これでsakuraがとれたはず。

んじゃあ、それを関数化して...

ssh_get () {
  COMPREPLY=(`grep '^Host ' ~/.ssh/config | awk '{print $2}'`)

complete -F ssh_get ssh

こんな感じに.bashrcにぶち込み(追記し)ます(忘れずに source .bashrc発行して読み込みなおしてね)

そうすると、ssh <tab>とするたびに .ssh/configに記載されたホストが表示されるはずです!感動!

しかし、このままではssh s<tab>としても、ssh a<tab>としても全てのホストが表示されてしまいます。

そうじゃない!僕らはssh s<tab>と押したら

sakura saku_host sakana

みたいに補完してくれるタブ補完を求めている!!

まあ、
grep '^Host ' ~/.ssh/config | awk '{print $2}'
にgrepをかければいいんですが、

ssh s<tab>としたときの's'が、どのような形で取得できるのかが謎でした。

そこで一番最初の記事。
https://unix.stackexchange.com/questions/11376/what-does-double-dash-mean-also-known-as-bare-double-dash

そして、
${COMP_WORDS[COMP_CWORD]}

ずばりこれです。
これでgrepすればいけるわけですね。

grep '^Host ' ~/.ssh/config | awk '{print $2}' | grep '^'$curw

これをCOMPREPLY=()の中にぶち込みましょう。

その結果がこちらになります。
ssh_get_m () {
  local curw
  curw=${COMP_WORDS[COMP_CWORD]}
#COMPREPLY=($(compgen -W `grep '^Host ' ~/.ssh/config | awk '{print $2}'` -- $curw))
  COMPREPLY=(`grep '^Host ' ~/.ssh/config | awk '{print $2}' | grep '^'$curw`)
}
complete -F ssh_get_m ssh

これを.bashrcに追記して読み込んでやれば、.ssh/configに記載さえしていれば補完を効かせることができます。
コメントアウトしている部分は、冒頭の記事で紹介されていた方法です。compgenという関数があるので、それを利用しています。

自分の中での整理もかねて、少し丁寧目に説明しましたが、上の関数をそのまま使っていただければ無事に動くと思います。(.ssh/configがちゃんと記載されていれば)
ただ、できればぜひ自分で理解したうえで使ってくださいね。

次はこれに続けてパスワード入力も自動でしてもらうようにするのが目標。だれかいい記事教えてくんろ...

-> しました。
https://qiita.com/hidaro/items/d65079adcfc44511e3bf

2
0
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
2
0