我不明白为什么这不会做标题所说的。
#!/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的输出,以扫描所有内容的方式,然后在结尾显示所有打开或关闭的端口。相反,它发生的是它在发现它们时将它们打印出来。我想将输出推送到一个数组然后打印数组将实现这样的输出,但它仍然一次打印出一个端口。为什么会这样?
另外,我为格式化道歉,代码标签有点奇怪。
答案 0 :(得分:0)
你的循环每次迭代调用popen
一次。您的popen
方法每次调用时都设置array = []
,然后用一个项目填充它,然后用puts
打印它。在下一个循环迭代中,您将array
重置为[]
并重新执行。
你只问过&#34;为什么,&#34;但是 - 您可以通过在array
的正文中设置main
一次,然后将其传递给popen
(或任意数量的方式)来解决此问题。