2012-12-04 13 views
6

Próbuję dowiedzieć się, jak wysłać łańcuch wielu poleceń net-ssh po sudo su - #{su_user} w Ruby.W jaki sposób net-ssh sudo su w Ruby

Mój obecny kod znajduje się poniżej i zawiesza się za pomocą polecenia sudo su, nawet po send_data "#{password}\n".

Tymczasem w systemie ręczne wykonanie sudo su - admin2 nie wymaga wprowadzenia hasła.

Każda pomoc zostanie doceniona!


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

Jesteś świadomy, że nie można komendy takie jak łańcuch, że po poleceniu 'sudo'? Ostatni 'pwd; whoami 'nie zostanie wykonane dopóki powłoka powłoki sudo nie powróci. Czy wziąłeś to pod uwagę? – Casper

Odpowiedz

3

sudo wspiera opcję -c, który przekazuje polecenie do pod-obudowy. Oto niektóre z sudo flagi, które mogą być przydatne dla Ciebie:

-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 

Tak, używając coś jak sudo su someuser -c 'ls;date', będziesz wykonywać polecenia ls i date jak someuser. Spróbuj na linii poleceń na tym hoście, aby poczuć, co możesz zrobić, a następnie zastosować go do sesji SSH.

Aby uzyskać więcej informacji, zobacz man sudo.

Ponadto, tylko jako wskazówka kodowania, można zmniejszyć:

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

do:

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

dzięki za odpowiedź, zmodyfikowałem linię w kodzie tak, aby zawierała opcję -c zalecaną przez Tina Mana. Dzięki.
channel.exec "pwd; whoami; sudo -u # {su_user} sh -c 'whoami; cd/tmp; pwd; ls'" –

+0

To była świetna wskazówka przechodząca w -c 'command' pod sudo su someuser works dobrze. To była świetna wskazówka. – wallerjake

Powiązane problemy