小编典典

使用Ruby自动将SSH传输到Windows

jenkins

我有13台运行Jenkins从站的Windows服务器。由于某些原因(Windows更新?),Jenkins从属设备会定期退出工作,并且需要重新启动Jenkins从属服务。如果我手动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起作用但脚本不起作用的任何想法?

谢谢菲尔


阅读 248

收藏
2020-07-25

共1个答案

小编典典

我在Pry中进行了尝试,发现了两个问题:

  1. HOST是未定义的,应该是host因为它是传递到块中的变量。
  2. SSH.start期望参数为STRINGclass,因此添加.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中对此进行了测试,现在可以使用了。我希望这有帮助。

2020-07-25