hitode909の日記

以前はプログラミング日記でしたが、今は子育て日記です

指定した範囲のホストのどれかにログインするスクリプト

実験室の端末のどれかにログインしたかったのだけど、どれが電源入ってるか分からなくて、困ったので、指定した範囲のホストに順にログインを試みるスクリプトを作った。

% ruby ssh.rb yamada 192.168.0. 1 40"

すると、ssh yamada@192.168.0.1からssh yamada@192.168.0.40まで、順にアクセスして、ログインを試みる。
どれかにログインできれば終了する。
まずpingを送って、返ってきたらsshでつなごうとするので、少しサーバーに優しい(はず)。

ポイント

pingを1回、タイムアウトを1秒で試みるのだけど、MacとLinuxでオプションが異なったので、少し困った。
Macでタイムアウト1秒にするには、-t 1でいいのだけど、Linuxだと-W 1にする必要がある。
PLATFORMに"linux"が含まれるかどうかを判別して、オプションを変更した。

ソース

#! /usr/bin/ruby

if ARGV.size != 4
  puts "direct-attack-ssh"
  puts "usage:   ruby ssh.rb (user) (host) (from) (to)"
  puts "example: ruby ssh.rb yamada 192.168.0. 1 40"
  exit
end

user      = ARGV[0]
host_base = ARGV[1]
host_from = ARGV[2].to_i
host_to   = ARGV[3].to_i

host_from.upto(host_to) do |i|
  host = "#{host_base}#{i}"

  puts "\ntry to connect with #{host}\n"
  if PLATFORM.include?("linux")
    # linux
    system "ping -c 1 -W 1 #{host}" or next
  else
    # mac or else
    system "ping -c 1 -t 1 #{host}" or next
  end

  puts "\n...seems ok. try to ssh #{host}\n"
  system "ssh #{user}@#{host}" and exit
  
  puts "waiting 1 second. Ctrl-c to exit\n"
  sleep 1
end