#!/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