#!/usr/bin/ruby
# --------------------------------------------------------
# SSH's into a set of hosts as user (assumes he has sudo)
# Uses local password (gathered earlier) to execute a set
# of commands as root
# --------------------------------------------------------
require 'rubygems'
require 'net/ssh'
# --------------------------------------------------------
# Store systems & commands to be run as whom
user = "user"
hosts = Array.new
hosts[0] = "system1"
hosts[1] = "system2"
cmds = Array.new
cmds[0] = "touch x"
cmds[1] = "touch y"
cmds[2] = "touch z"
# --------------------------------------------------------
# Cache tokens
print "Enter local password for hosts (assuming same): "
system("stty -echo") # hide input (password)
password = gets.chomp.to_s
system("stty echo") # show input again
print "\n"
# use ssh agent to cache key
system("ssh-agent")
system("ssh-add")
# --------------------------------------------------------
# SSH into each host and sudo execute commands
hosts.each do |host|
Net::SSH.start(host, user) do |session|
shell = session.shell.open
shell.cd "/home/#{user}"
cmds.each do |cmd|
shell.echo "#{password} | sudo -S #{cmd}"
end
shell.exit
# give the above commands sufficient time to terminate
sleep 0.5
# display the output
$stdout.print shell.stdout while shell.stdout?
$stderr.puts "-- stderr: --"
$stderr.print shell.stderr while shell.stderr?
end
end
# --------------------------------------------------------
# Clean out cached tokens
password = ""
system("ssh-add -d ~/.ssh/id_rsa")
Tuesday, August 21, 2007
Ruby Scripting Part II
Ruby's Net::SSH is pretty cool. Here's a script to SSH into a set of hosts and do some work. It assumes that you're using sudo with local passwords and well as public keys.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment