使用Ruby自动SSH到Windows

时间:2012-12-26 18:00:47

标签: ruby windows ssh jenkins

我有13个运行Jenkins Slaves的Windows服务器。由于某种原因(Windows更新?),Jenkins奴隶定期退出工作,需要重新启动Jenkins Slave服务。如果我手动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
}

脚本在所有机器上执行,我看到服务已启动的输出。但是,从不有效。当我回到机器时,服务还没有开始。

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

有关手动执行SSH工作原理的任何想法,但脚本没有?

由于 菲尔

1 个答案:

答案 0 :(得分:2)

我在Pry试了一下,发现了两个问题:

  1. HOST未定义,应为host,因为这是传递给块的变量。
  2. SSH.start希望参数为STRING类,因此请添加.to_s,如下所示。
  3. 另外,当一个块超过1行时,我将它转换为使用do...end的惯用Ruby模式。

    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
    

    我在Pry中测试了它,它现在正在工作。我希望这会有所帮助。

相关问题