【发布时间】:2012-02-22 16:41:01
【问题描述】:
我目前在这方面遇到了困难,我似乎找不到错误,但我认为这与 Ruby 块范围规则有关。我在这里阅读了很多帖子,但它们似乎与我遇到的问题并不相似(或者我可能太笨了,看不到它)。我有一个服务器对象,目前只有两个实例变量(主机名和操作系统)定义了 setter/getter。
问题是我在读取 ssh 通道数据的块中间定义了一个服务器对象的操作系统。我知道通道具有正确的数据,因为当我运行脚本时,它会正确打印出“放置本地操作系统”行,但是当它到达 ch.exec 块的末尾时,Server.getOS 已变回零。
有什么想法吗?
注释和代码: “hosts”是一个服务器对象数组。
hosts.each do |server|
begin
Net::SSH.start(server.getHostname, user , :password => password , :port=> port) do |ssh|
channel = ssh.open_channel do |ch|
ch.exec "uname" do |chan, success|
raise "could not execute uname command" unless success
chan.on_data do |c, data|
server.setOS = data
puts "local OS: #{server.getOS}"
# server.getOS = "AIX" here
end
chan.on_extended_data do |c, type, data|
puts data
end
end
puts "OS: #{server.getOS} -- hostname: #{server.getHostname}"
# server.getOS = "" here..
.. 并从那里开始基于 server.getOS 的处理,但 server.getOS 为 nil。
【问题讨论】:
标签: ruby