使用Ruby自动化SSH到Windows

我有一个运行Jenkins从站的13个窗口服务器。 出于某种原因(Windows更新?),jenkins奴隶定期退出工作,jenkins奴隶服务需要重新启动。 如果我手动SSH到机器(cygwin SSH服务器正在运行),我只需input:

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工作,但脚本不?

谢谢菲尔

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

  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 

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