2012-12-04 41 views
6

我想知道如何在Ruby中的sudo su - #{su_user}之后发送多个net-ssh命令的链。如何在Ruby中使用net-ssh sudo su

我的当前代码在下面,并且挂起了sudo su命令,甚至在send_data "#{password}\n"之后。

同时,在系统上,手动执行sudo su - admin2不需要输入密码。

任何帮助,将不胜感激!


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

你知道,你不能命令链那样的'sudo'命令后?最后一个'pwd;直到sudo命令shell返回后,whoami才会被执行。你有没有考虑到这一点? – Casper

回答

3

sudo支持-c选项,它通过一个命令至子壳。以下是一些sudo标志,可能对你有用的:

-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 

因此,使用类似sudo su someuser -c 'ls;date',你会执行命令lsdatesomeuser。试一试该主机上的命令行,以了解您可以执行的操作,然后将其应用于SSH会话。

有关更多信息,请参阅man sudo

而且,就像编码提示,可以减少:

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

到:

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

感谢您的回复,我修改了代码中的行,以包含tin man推荐的-c选项。谢谢。
channel.exec“pwd; whoami; sudo -u#{su_user} sh -c'whoami; cd/tmp; pwd; ls'” –

+0

这是一个很棒的技巧,通过-c'命令'在sudo su someuser下执行好。这是一个很棒的提示。 – wallerjake