交互式Ruby脚本

时间:2014-07-31 11:38:45

标签: ruby telnet interactive

我尝试编写一个ruby脚本,该脚本登录到远程服务器,切换到另一个用户,执行脚本并回答该脚本的问题。现在,我可以登录,但它会挂起执行bash脚本。我不确定我是否得到了提示部分,但它尚未达到这一点。它"挂起"关于脚本的运行,或者它不是将脚本的输出打印到屏幕上。

这就是我现在所得到的:

require 'rubygems'
require 'net/ssh'
require 'net/ssh/telnet'

s = Net::SSH::Telnet.new("Host" => "server1", "Username" => "dev", "Password" => "12345", "Prompt" => /[$%#>] \z/n)

puts s.cmd("sudo -s")
puts s.cmd("su - user1")
puts s.cmd("/opt/develop/develop-bin/start.sh")
puts s.waitfor(/Prompt/)

1 个答案:

答案 0 :(得分:0)

以下是适用于我的代码段。它取自较大的图书馆,因此请将其视为一个例子。填写变量commandusernamepasswordservernamesudoer,然后尝试

class AuthenticationError < StandardError; end

AUTH_METHODS = ['hostbased', 'password', 'keyboard-interactive']
MYPROMPT = SecureRandom.hex # or whatever you want

ret = ""
stderr_data = ""

Net::SSH.start(servername, username, :password => password, :auth_methods => AUTH_METHODS) do |ssh|
  ssh.open_channel do |channel|
    channel.on_data do |channel, data|
      ret += data 
      raise AuthenticationError, "SUDO ACCESS DENIED" if data.inspect.include?('Sorry, try again.') || data.inspect.include?('not in sudoers')
      channel.send_data(password+"\n") if data.inspect.include? MYPROMPT
      sleep 0.1
    end
    channel.on_extended_data do |ch, type, data|
      stderr_data+=data
    end
    channel.request_pty
    channel.exec("sudo -p #{MYPROMPT} su - #{sudoer} -c '#{command}'")
    channel.wait
  end
end

puts ret.gsub(/^"/,'').gsub(/"$/,'')