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

Posted

技术标签:

【中文标题】如何在 Ruby 中使用 net-ssh sudo su【英文标题】:How to net-ssh sudo su in Ruby 【发布时间】:2012-11-22 04:37:51 【问题描述】:

我试图弄清楚如何在 Ruby 中的 sudo su - #su_user 之后发送多个 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

【问题讨论】:

你知道你不能在sudo 命令之后链接这样的命令吗?最后一个 pwd; whoami 直到 sudo 命令 shell 返回后才会执行。您考虑到这一点了吗? 【参考方案1】:

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

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

更多信息请参见man sudo

另外,作为编码提示,您可以减少:

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

到:

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

【讨论】:

感谢您的回复,我修改了代码中的这一行,加入了 Tin Man 推荐的 -c 选项。谢谢。 channel.exec "pwd; whoami; sudo -u #su_user sh -c 'whoami ; cd /tmp ; pwd; ls'" 这是一个很棒的技巧,在 sudo su someuser 下传入 -c 'command' 效果很好。这是一个很好的提示。

以上是关于如何在 Ruby 中使用 net-ssh sudo su的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 sudo 运行 ruby

ruby连接liunx后台返回/dev/sda分区大小

运行 sudo gem install fastlane -NV 在安装 fastlane ruby​​zip 需要 ruby​​ version >= 2.4 时抛出错误

如何在不为 RVM 用户授予 sudo 访问权限的情况下安装 RVM 系统要求

如何在Mac OS X上安装 Ruby运行环境

如何在mac os x上安装 ruby运行环境