LoginSignup
17
17

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-11-12

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

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
17
17