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