使用ruby gem net-ssh-multi可一次在多个服务器上执行sudo命令

| 在上一个问题中,我弄清楚了如何在多个服务器上启动经过密码验证的ssh会话以运行单个命令。现在,我需要能够执行\“ sudo \”命令。问题是,net-ssh-multi没有分配伪终端(pty),而sudo需要运行该伪终端,从而导致以下错误:   [127.0.0.1:stderr] sudo:抱歉,您必须具有tty才能运行sudo 根据文档,伪终端可以通过对通道对象的方法调用来分配,但是,以下代码不起作用:上面会产生\“ no tty \”错误:
require \'net/ssh\'
require \'net/ssh/multi\'

Net::SSH::Multi.start do |session|


  # define the servers we want to use
  my_ticket.servers.each do |session_server|
    session.use session_server , :user =>  user_name ,  \\
                              :password => user_pass
  end


 # execute commands on all servers
  session.exec \'sudo ls /root\' do |channel, stream, data|
   if data =~ /^\\[sudo\\] password for user:/
     channel.request_pty # <- problem must be here.
     channel.send_data user_pass
   end

  end

 # run the aggregated event loop
 session.loop
end
$ ruby​​ --version 红宝石1.8.7(2008-08-11补丁程序级别72)[i386-cygwin]     
已邀请:
        你可以尝试这样的事情:
  channel.request_pty do |c, success|
    if success
      command = \"sudo YOUR_COMMAND\"
      c.exec(command) do |c, success|
        # Some processing
      end
    end
  end
在这种情况下,'sudo \'位于其中。     
        您需要在运行命令之前请求pty。
session.open_channel do |ch|
  ch.request_pty
  ch.exec \"sudo ls /root\"
end
您也可以从/ etc / sudoers中删除tty请求。为此,运行
visudo
并注释
Defaults requiretty
    
        感谢@Christian和这个奇妙的Pastie,这就是我最后要做的事情:
Net::SSH::Multi.start do |session|

# define the servers we want to use
my_ticket.servers.each do |session_server|
  session.use session_server , :user =>  my_ticket.user_name ,  \\
  :password => my_ticket.user_pass
end



session.open_channel do |channel|
channel.request_pty do |c, success|
  raise \"could not request pty\" unless success
  channel.exec   \"sudo YOUR_COMMAND\"
  channel.on_data do |c_, data|
  if data = /\\[sudo\\]/
  channel.send_data(@password + \"\\n\")
  end  
   puts data

    end
   end
  end

# run the aggregated event loop
  session.loop
end
    

要回复问题请先登录注册