Chef リポジトリなどで、プロジェクトごとの ssh_config を作成している。
ssh 実行時に ssh -F ssh_config hostname
とすれば使えるんだけど、毎回タイプするのは面倒なので、カレントディレクトリに ssh_config
があれば自動で使うラッパーを書いた。
#!/usr/bin/env ruby
require "shellwords"
if !ARGV.include?("-F") && File.exists?("ssh_config")
# ANSI Color Code
START_YELLOW = "\e[33m"
END_COLOR = "\e[0m"
puts START_YELLOW + "Using: #{File.expand_path("ssh_config")}" + END_COLOR
exec "ssh -F ssh_config #{ARGV.shelljoin}"
else
exec "ssh #{ARGV.shelljoin}"
end
元の引数に -F
がなく、カレントディレクトリに ssh_config
があれば、引数を追加して ssh を exec している。
ssh_config がみつかったときは、メッセージを (黄色で) 表示してる。何も出さないと混乱しそうなので。
あとはこれを適当なとこに保存、実行権限つけて、ssh の alias にしてやれば OK。
さらに zsh 用の補完関数も書いた。ここでは上記コマンドを ssh-cwd-config
としている。$fpath
のどこかに _ssh-cwd-config
という名前で保存する。
#compdef ssh-cwd-config
_ssh-cwd-config() {
if [ -e ssh_config ]
then
ssh_config=ssh_config
else
ssh_config=~/.ssh/config
fi
hosts=$(grep -E "Host " $ssh_config | sed 's/Host //')
_arguments ": :($hosts)"
}
これで ssh [TAB]
とすればプロジェクトごとのホストが一覧・補完できて便利。
おまけ: knife solo 版
#!/usr/bin/env ruby
require "shellwords"
SUBCOMMANDS = [
%w(solo prepare),
%w(solo cook),
%w(solo clean)
]
subcommand = SUBCOMMANDS.find do |cmds|
cmds.each_with_index.all? do |cmd, i|
ARGV[i] == cmd
end
end
if subcommand && !ARGV.include?("-F") && File.exists?("ssh_config")
# ANSI Color Code
START_YELLOW = "\e[33m"
END_COLOR = "\e[0m"
puts START_YELLOW + "Using: #{File.expand_path("ssh_config")}" + END_COLOR
exec "knife #{subcommand.shelljoin} -F ssh_config #{ARGV[subcommand.size..-1].shelljoin}"
else
exec "knife #{ARGV.shelljoin}"
end