首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Ruby中使用net-ssh sudo su

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

Stack Overflow用户
提问于 2012-12-04 14:11:34
回答 1查看 4.2K关注 0票数 6

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

我的当前代码在下面,并使用sudo su命令挂起,即使在send_data "#{password}\n"之后也是如此。

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

任何帮助都将不胜感激!

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-04 14:58:54

sudo支持-c选项,它将一个命令传递给子shell。下面是一些可能对您有用的sudo标志:

代码语言:javascript
复制
-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

此外,就像代码提示一样,您可以减少:

代码语言:javascript
复制
if data =~ /\[sudo\]/ || data =~ /Password/i

至:

代码语言:javascript
复制
if (data[/\[sudo\]|Password/i])
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13704836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档