SSH自动化与Ruby的窗户(Automating SSH to windows with Ruby

2019-08-04 18:02发布

我有运行詹金斯从站13台的Windows服务器。 出于某种原因(Windows更新?),詹金斯奴隶定期辞掉工作,需要重新启动詹金斯从服务。 如果我手动SSH到机器(cygwin的SSH服务器是否正在运行),我只需键入:

net stop "Jenkins Slave"
net start "Jenkins Slave"

而这个(几乎)总是可以解决问题。

所以我写了一个Ruby脚本来自动执行此。

这里是:

#!/usr/bin/env ruby
require 'rubygems'
require 'net/ssh'

USER = 'Administrator'
PASS = 'PASSWORD'
hosts = [:breckenridge, :carbondale, :crestone, :denali, :gunnison, :sneffels, "mammoth", "whitney", "snowmass", "firestone",  "avon", :grizzly, :silverton]

hosts.each {|host|
    puts "SSHing #{host} ..." 
    Net::SSH.start( HOST, USER, :password => PASS ) do |ssh|
        puts ssh.exec!('net stop "Jenkins Slave"')
        puts ssh.exec!('net start "Jenkins Slave"')
        puts "Logging out..."
    end
}

该脚本执行在所有机器上,我看到服务已启动输出。 然而,这永远不会奏效。 当我ssh回机,服务尚未启动。

可悲的是,我无法使用Linux的 - 我不是在这些机器的控制。

为什么手动运行SSH的作品,但剧本没有任何想法?

感谢菲尔

Answer 1:

我尝试了一下在撬开,发现两个问题:

  1. HOST是未定义的,它应该是host ,因为这是变量被传递到块。
  2. SSH.start期望参数为STRING类,因此添加.to_s如下所示。

另外,我它切换到使用的惯用的Ruby图案do...end当块延伸经过1行。

hosts.each do |host|
    puts "SSHing #{host} ..." 
    Net::SSH.start( host.to_s, USER, :password => PASS ) do |ssh|
        puts ssh.exec!('date')
        puts "Logging out..."
    end
end

我在撬测试这和它现在的工作。 我希望这有帮助。



文章来源: Automating SSH to windows with Ruby