一次放入数组的内容

时间:2014-07-04 04:55:06

标签: ruby

我不明白为什么这不会做标题所说的。

#!/usr/bin/env ruby


require 'socket'
require 'timeout'


class Scanner


def initialize(host, port)
@host = host
@port = port
end


def popen
begin
  array = []

  sock = Socket.new(:INET, :STREAM)
  sockaddr = Socket.sockaddr_in(@port, @host)

  Timeout::timeout(5) do
    array.push("Port #{@port}: Open") if sock.connect(sockaddr)
  end

  puts array

rescue Timeout::Error
  puts "Port #{@port}: Filtered"
rescue Errno::ECONNREFUSED
end
  end

end # end Scanner


def main
  begin
    p = 1

case ARGV[0]
when '-p'
  eport = ARGV[1]
  host = ARGV[2]
else
  eport = 65535
  host = ARGV[0]
end

t1 = Time.now

puts "\n"
puts "-" * 70
puts "Scanning #{host}..."
puts "-" * 70

while p <= eport.to_i do
  scan = Scanner.new(host, p)
  scan.popen
  p += 1
end

t2 = Time.now
time = t2 - t1
puts "\nScan completed: #{host} scanned in #{time} seconds."

rescue Errno::EHOSTUNREACH
  puts "This host appears to be unreachable"
rescue Interrupt
  puts "onnection terminated."
end
end


main

我想要实现的是类似于nmap的输出,以扫描所有内容的方式,然后在结尾显示所有打开或关闭的端口。相反,它发生的是它在发现它们时将它们打印出来。我想将输出推送到一个数组然后打印数组将实现这样的输出,但它仍然一次打印出一个端口。为什么会这样?

另外,我为格式化道歉,代码标签有点奇怪。

1 个答案:

答案 0 :(得分:0)

你的循环每次迭代调用popen一次。您的popen方法每次调用时都设置array = [],然后用一个项目填充它,然后用puts打印它。在下一个循环迭代中,您将array重置为[]并重新执行。

你只问过&#34;为什么,&#34;但是 - 您可以通过在array的正文中设置main一次,然后将其传递给popen(或任意数量的方式)来解决此问题。