2012-12-04 40 views
6

Tôi đang cố gắng tìm hiểu làm thế nào để một chuỗi gửi nhiều lệnh net-ssh sau một sudo su - #{su_user} trong Ruby.Làm thế nào để net-ssh sudo su trong Ruby

Mã hiện tại của tôi ở bên dưới và bị treo bằng lệnh sudo su, ngay cả sau send_data "#{password}\n".

Trong khi đó, trên hệ thống, việc thực hiện thủ công sudo su - admin2 không yêu cầu nhập mật khẩu.

Mọi trợ giúp sẽ được đánh giá cao!


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

Bạn đang nhớ rằng bạn không thể lệnh chuỗi như thế sau khi 'lệnh sudo'? 'Pwd cuối cùng; whoami' sẽ không được thực thi cho đến sau khi sudo command shell trả về. Bạn có tính đến điều này? – Casper

Trả lời

3

sudo hỗ trợ các tùy chọn -c, mà đi một lệnh để các tiểu vỏ. Dưới đây là một số trong những sudo cờ mà có thể có ích cho bạn:

-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 

Vì vậy, sử dụng một cái gì đó giống như sudo su someuser -c 'ls;date', bạn sẽ thực hiện các lệnh lsdate như someuser. Hãy thử nó ở dòng lệnh trên máy chủ đó để có được cảm giác về những gì bạn có thể làm, sau đó áp dụng nó vào phiên SSH của bạn.

Xem man sudo để biết thêm thông tin.

Ngoài ra, cũng giống như một mẹo mã hóa, bạn có thể giảm:

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

tới:

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

cảm ơn câu trả lời, tôi đã sửa đổi dòng mã để bao gồm tùy chọn -c như Tin Man được khuyến nghị. Cảm ơn.
channel.exec "pwd; whoami; sudo -u # {su_user} sh -c 'whoami; cd/tmp; pwd; ls'" –

+0

Đây là một mẹo tuyệt vời đi qua trong lệnh '-c' dưới sudo su someuser hoạt động tốt. Đó là một mẹo tuyệt vời. – wallerjake

Các vấn đề liên quan