lib/ssh.rb in traquitana-0.0.20 vs lib/ssh.rb in traquitana-0.0.21
- old
+ new
@@ -1,31 +1,51 @@
require "net/scp"
require "net/ssh"
+require "highline/import"
module Traquitana
class SSH
attr_reader :host, :user, :options
def initialize(host,user,options=nil)
@host = host
@user = user
@options = options || {}
- STDOUT.puts "Connecting to #{@host} using user #{@user}"
+ @options[:verbose] = :error
+ STDOUT.puts "Connecting to \e[1m#{@host}\e[0m using user \e[1m#{@user}\e[0m"
end
def execute(cmds,verbose=false)
- rst = []
- Net::SSH.start(@host,@user,@options) do |ssh|
- for cmd in cmds
- STDOUT.puts "Executing #{cmd} on remote host ..." if verbose
- rst << ssh.exec!(cmd)
- end
- end
- rst
+ rst = []
+
+ Net::SSH.start(@host,@user,@options) do |ssh|
+ ssh.open_channel do |channel|
+ channel.request_pty do |ch, success|
+ raise "Can't get PTY" unless success
+ for cmd in cmds
+ STDOUT.puts "Executing #{cmd} on remote host ..." if verbose
+ rst << ch.exec(cmd)
+ end # for
+
+ ch.on_data do |ch, data|
+ msg = data.inspect.to_s.gsub(/^"/,"").gsub(/"$/,"").gsub(/"\\"/,"\\").gsub("\\r","").gsub("\\n","\n").gsub("\\e","\e").strip.chomp
+ if data.inspect =~ /sudo/
+ pwd = ask("\nNeed password to run as root/sudo: ") {|c| c.echo = "*"}
+ channel.send_data("#{pwd}\n")
+ sleep 0.1
+ else
+ puts msg if msg.size > 1
+ end
+ ch.wait
+ end
+ end # tty
+ end # channel
+ end # ssh start
+ rst
end
def send_files(col,updater=nil)
- Net::SCP.start(@host,@user,@options) do |scp|
+ Net::SCP.start(@host,@user,@options) do |scp|
for files in col
from, to = *files
next if from.nil? || to.nil?
scp.upload!(from,to) do |ch,name,sent,total|
if !updater.nil?