Ruby
Zsh
SSH

ssh でカレントディレクトリの ssh_config を使用する (補完つき)

More than 3 years have passed since last update.

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