2014/11/10 平見知久
sshのパラメータをbashで補完させる
サポートなんてやっていると、いくつも環境持つことになります。
データがろくに入っていない純粋な検証用なら鍵やアカウント共通でもいいのでしょうが、多少でもデータが入っているとさすがにそうは行きません。SSH鍵やポート、アカウント等はそれぞれ別のものとして管理することになります。
これらのパラメータを楽に管理するために簡単なスクリプトをネタに、bash補完で楽をする方法を紹介します。
まずsshのパラメータを簡単に指定できるスクリプトから。パスの通ったところにsshxという名前で配置し、実行権限をつけておきます。
#! /usr/bin/ruby require 'json' require 'optparse' keydir="~/ssh-keys/" confFile="~/ssh-keys/sshx.conf" # confファイル読み込み confData = "" IO.foreach(confFile) do |line| confData += line end conf = JSON.parse(confData) # コマンドライン解析 opt = OptionParser.new opt.on('-L') do |v| conf.each_key do |k| desc = conf[k]["description"] if desc != nil then print "#{k}: #{desc}\n" else print "#{k}\n" end end exit 1 end opt.on('-ll') do |v| conf.each_key do |k| print "#{k} " end print "\n" exit 0 end opt.parse!(ARGV) setting = conf[ARGV[0]] if setting == nil then print "Invalid confname #{ARGV[0]}. Check sshx -l.\n" exit 1 end cmdline = [] if setting["port"] != nil then cmdline << "-p" << setting["port"] end if setting['option'] != nil then cmdline << "#{setting['option']}" end if setting["pem"] != nil then cmdline << "-i" << keydir + setting["pem"]end cmdline << "#{setting['user']}@#{setting['host']}" exec('ssh',*cmdline)
次に設定ファイルとして、接続先一覧を記述したファイルを~/ssh-keys/sshx.confとして作成します。JSON形式です。
必要ならsshx側のパスを好みの場所に変更してください。sshの鍵(*.pem)も同じディレクトリに配置します。お約束ですがパーミッションに注意して下さい。
{ "dev1": { "host" : "192.168.100.1", "port" : "10022", "user" : "user1", "pem" : "dev1.pem", "description" : "開発環境1" }, "dev2" : { "host" : "192.168.100.2", "port" : "10122", "user" : "user2", "pem" : "dev3.pem", "description" : "開発環境2" }, "fumidai-pf" : { "host" : "192.168.100.3", "port" : "10522", "user" : "dev3", "pem" : "dev3.pem", "option" : "-L8080:localhost:80", "description" : "踏み台(w/PF)" }, "fumidai" : { "host" : "192.168.100.3", "port" : "10522", "user" : "dev3", "pem" : "dev3.pem", "description" : "踏み台" } }
上記の例ですと、dev1, dev2, fumidai-pf, fumidaiをパラメータで指定するとIPやポート、鍵等を適切に選んで接続してくれます。
$ sshx dev1 dev1$
とかやっていると、今度はパラメータを一々手で入れるのが面倒くさくなってきます(苦笑)。
シェルならパラメータは補完して欲しいもの。というわけで、bashの補完機能で補完させることにします。
~/.bashrcあたりに以下を追加します。
_sshx() { CAND=`sshx -ll` COMPREPLY=(`compgen -W"$CAND" $2`) } complete -F _sshx sshx
sshx -llで候補となるパラメータの一覧を表示するようにしているのがミソです。bash提供のcompgenコマンドとの組み合わせで一覧から候補を絞り込んで選択できるようになります。
上記の例ですと、sshx fで、ファイル名の補完と同様にfumidaiまで補完され、さらにを押すとそこから選択可能な一覧(例ではfumidaiとfumidai-pf)が表示されます。
今回は接続先リストを補完させましたが、一覧表示できれば色々と補完させることができます。よく使うコマンド系のパラメータを色々補完させてみるのも一興かもしれません。