2012-12-04 11 views
6

Ich versuche herauszufinden, wie eine Kette von mehreren net-ssh-Befehle nach einem sudo su - #{su_user} in Ruby senden.Wie net-ssh sudo su in Ruby

Mein aktueller Code ist unten und hängt mit dem sudo su Befehl, auch nach dem send_data "#{password}\n".

In der Zwischenzeit erfordert eine manuelle Ausführung von sudo su - admin2 auf dem System keine Passworteingabe.

Jede Hilfe wäre willkommen!


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

Sie wissen, dass Sie nicht Ketten Befehle wie, dass nach dem 'sudo' Befehl? Das letzte 'pwd; whoami wird erst ausgeführt, nachdem die Sudo-Befehls-Shell zurückgegeben wurde. Hast du das berücksichtigt? – Casper

Antwort

3

sudo unterstützt die -c Option, die einen Befehl an die Unterschale durchläuft. Hier sind einige der sudo Flags, die Ihnen nützlich sein könnten:

-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 

Also, mit so etwas wie sudo su someuser -c 'ls;date', werden Sie die Befehle ls und date als someuser auszuführen. Probieren Sie es in der Befehlszeile dieses Hosts aus, um ein Gefühl dafür zu bekommen, was Sie tun können, und wenden Sie es dann auf Ihre SSH-Sitzung an.

Weitere Informationen finden Sie unter man sudo.

Auch nur als Codierung Spitze, können Sie reduzieren:

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

zu:

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

danke für die Antwort, ich habe die Zeile im Code geändert, um die Option -c wie Tin Man empfohlen. Vielen Dank.
channel.exec "pwd; whoami; sudo -u # {su_user} sh-c 'whoami; cd/tmp; pwd; ls'" –

+0

Das war ein großartiger Tipp, der in 's-Befehl' unter sudo su someuser eingeht Gut. Das war ein guter Tipp. – wallerjake

Verwandte Themen