如何在Ruby中使用net-ssh sudo su

Sys*_*RJR 6 ruby sudo su net-ssh

我试图弄清楚如何sudo su - #{su_user}在Ruby 之后发送多个net-ssh命令的发送链.

我当前的代码在下面,并挂起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
Run Code Online (Sandbox Code Playgroud)

the*_*Man 3

sudo支持-c将命令传递到子 shell 的选项。以下是一些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
Run Code Online (Sandbox Code Playgroud)

因此,使用类似 的东西sudo su someuser -c 'ls;date',您将执行命令lsdateas someuser。在该主机上的命令行中尝试一下,了解您可以做什么,然后将其应用到您的 SSH 会话。

请参阅man sudo获取更多信息。

另外,正如编码技巧一样,您可以减少:

if data =~ /\[sudo\]/ || data =~ /Password/i
Run Code Online (Sandbox Code Playgroud)

到:

if (data[/\[sudo\]|Password/i])
Run Code Online (Sandbox Code Playgroud)