2012-12-04 18 views
6

Sto cercando di capire come inviare una catena di più comandi net-ssh dopo un sudo su - #{su_user} in Ruby.Come su net-ssh sudo su Ruby

Il mio codice corrente è sotto, e si blocca con il comando sudo su, anche dopo lo send_data "#{password}\n".

Nel frattempo, sul sistema, l'esecuzione manuale di sudo su - admin2 non richiede l'immissione di una password.

Qualsiasi aiuto sarebbe apprezzato!


require 'rubygems' 
require 'net/ssh' 
host = 'hostA' 

user = 'admin' 
password = 'hostA_pwd' 
su_user = 'Admin2' 

Net::SSH.start(host, user, :password => password) do |ssh| 

    ssh.open_channel do |channel| 
     channel.request_pty do |c, success| 
     raise "could not request pty" unless success 

     channel.exec "pwd; whoami; sudo su - #{su_user} ; pwd ; whoami" 
     channel.on_data do |c_, data| 
      if data =~ /\[sudo\]/ || data =~ /Password/i 
      channel.send_data "#{password}\n" 
      else  
      result << data 
      end 
     end 
     puts result 
     end 
    end 
    ssh.loop 
    end 
+0

Siete consapevoli che non si può comandi della catena come che dopo il comando 'sudo'? L'ultimo 'pwd; whoami' non verrà eseguito fino a dopo il ritorno della shell del comando sudo. Hai tenuto conto di questo? – Casper

risposta

3

sudo supporta l'opzione -c, che passa un comando al sub-shell. Ecco alcune delle sudo bandiere che potrebbero essere utili a voi:

-c, --command=COMMAND 
     pass a single COMMAND to the shell with -c 

--session-command=COMMAND 
     pass a single COMMAND to the shell with -c and do not create a new session 

-m, --preserve-environment 
     do not reset environment variables 

-s, --shell=SHELL 
     run SHELL if /etc/shells allows it 

Quindi, usando qualcosa come sudo su someuser -c 'ls;date', potrai eseguire i comandi ls e date come someuser. Fai un tentativo alla linea di comando su quell'host per avere un'idea di cosa puoi fare, quindi applicalo alla tua sessione SSH.

Vedere man sudo per ulteriori informazioni.

Inoltre, proprio come un suggerimento di codifica, è possibile ridurre:

if data =~ /\[sudo\]/ || data =~ /Password/i 

a:

if (data[/\[sudo\]|Password/i]) 
+0

grazie per la risposta, ho modificato la riga in codice per includere l'opzione -c come consigliato da Tin Man. Grazie.
channel.exec "pwd; whoami; sudo -u # {su_user} sh -c 'whoami; cd/tmp; pwd; ls'" –

+0

Questo è stato un grande consiglio passando in -c 'command' sotto il sudo su someuser works bene. E 'stato un grande consiglio. – wallerjake