如何使用NEXEC在Ruby中的多个主机上运行命令

时间:2015-09-11 23:58:49

标签: ruby-on-rails ruby ruby-on-rails-4 rubygems server

我想在Ruby中使用net / ssh gem在多个服务器上运行命令。 所有主机名都保存在一个文件中,从保存的文件中我逐个读取主机名,并希望使用NEXEC执行命令。

例如:对于单个主机,我运行了这个命令

$NEXEC="/data/bladelogic-7.3/bin/nexec"

$INSTANCE=`#{$NEXEC} hostname ls -ltr mypath` 

如何使用NEXEC为多个主机名执行此操作

以下是我的代码:

require 'rubygems'
require 'net/ssh'
require 'net/ssh/multi'
puts "Enter the username"
@username=gets.chomp

File.open("path for multiple host file names","r") do |s|
s.each_line do |line|
Net::SSH.start(line.chomp,@username) do |ssh|
result=ssh.exec!("ls -ltr")
result1=`#{$NEXEC} line ls -ltr`
puts result
end
end
end

错误:

访问主机线时出错:远程主机未知

1 个答案:

答案 0 :(得分:0)

这已经过了很长时间,但我遇到了类似的问题,让我们从这开始:

  • 你的缩进很糟糕,每个缩进两个空格根据 Ruby Styleguide
  • net/ssh gem还需要一个类似于:password => 'your_pass_here'
  • 的密码参数
  • 在Ruby中有一个名为etc的库,您可以自动获取登录的用户名,这样您就不必输入用户名,只需输入密码< / LI>
  • Ruby使用File.read
  • 可以更轻松地读取文件

建议编辑:

require 'rubygems'
require 'net/ssh'
require 'etc'

print "Enter password: "
@password = gets.chomp #<= You can get rid of the echo so they can't see your keystrokes if you want, see below
@username = Etc.getlogin

File.read(path/to/file.file) do |s|
  s.each_line do |line|
    Net::SSH.start(line.chomp, @username, :password => @password) do |ssh|
      result = ssh.exec!("ls -la")
      result1=`#{$NEXEC} line ls -ltr`
      puts result
    end
  end
end

要摆脱密码的回声,一种方法是使用系统调用:

system "stty -echo"
@password = gets.chomp
system "stty echo"

总是 回想起回音,或者您无法看到该程序中输入的任何内容。