ruby - 使用 Ruby 自动 SSH 到 Windows

标签 ruby windows ssh jenkins

我有 13 个运行 Jenkins Slaves 的 Windows 服务器。出于某种原因(windows 更新?),Jenkins slaves 周期性地停止工作并且 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
}

脚本在所有机器上执行,我看到服务已经启动的输出。但是,这从不 起作用。当我 ssh 回到机器时,服务还没有启动。

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

关于为什么手动执行的 SSH 有效,但脚本却无效的任何想法?

谢谢 菲尔

最佳答案

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

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

此外,我将其切换为惯用的 Ruby 模式,即当 block 超出 1 行时使用 do...end

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 中对此进行了测试,它现在可以正常工作了。我希望这会有所帮助。

关于ruby - 使用 Ruby 自动 SSH 到 Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14044289/

相关文章:

Win CE 6 的 C 文件编译

mongodb - 我的 .js 文件应该放在哪里?

ssh - paramiko.ssh_exception.SSHException:TCP转发请求被拒绝

ruby-on-rails - 我已经安装了一个 gem - 但在/lib 中找不到它

ruby - 在 Ruby 中加密/解密 3DES

c++ - 如何找出运行 vista/w7 的机器的当前颜色深度?

windows - Git 服务器端 Hook ,无需 SSH 即可访问执行推送的用户

ruby - 识别独特的 block

ruby-on-rails - 如何在一个 View 中对两个表进行分页

python - 安装mysqldb python接口(interface)时找不到mysql_config