Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using the ruby gem net-ssh-multi to execute a sudo command on multiple servers at once

Tags:

ruby

sudo

net-ssh

In a previous question I figured out how to start a password-authenticated ssh sessions on multiple servers to run a single command. Now I need to be able to execute a "sudo" command. The problem is, that net-ssh-multi does not allocate a pseudo terminal (pty), which sudo needs to run, resulting in the following error:

[127.0.0.1 : stderr] sudo: sorry, you must have a tty to run sudo

According to the documentation, a pseudo-terminal can be allocated with a method call to a channel object, however, the following code does not work: it generates the "no tty" error above:

require 'net/ssh'
require 'net/ssh/multi'

Net::SSH::Multi.start do |session|


  # define the servers we want to use
  my_ticket.servers.each do |session_server|
    session.use session_server , :user =>  user_name ,  \
                              :password => user_pass
  end


 # execute commands on all servers
  session.exec 'sudo ls /root' do |channel, stream, data|
   if data =~ /^\[sudo\] password for user:/
     channel.request_pty # <- problem must be here.
     channel.send_data user_pass
   end

  end

 # run the aggregated event loop
 session.loop
end

$ ruby --version

ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-cygwin]

like image 524
Dmitri Avatar asked May 31 '11 22:05

Dmitri


1 Answers

Can you try something like this:

  channel.request_pty do |c, success|
    if success
      command = "sudo YOUR_COMMAND"
      c.exec(command) do |c, success|
        # Some processing
      end
    end
  end

In this case 'sudo' is inside.

like image 146
Christian Avatar answered Sep 28 '22 04:09

Christian