这段代码应该循环遍历IP地址数组并检查端口是否打开。
class Ranger
def initialize(port,file)
@port = port
@file = file
@arr = []
end
def regex(f)
reg = IO.read(f)
reg.scan /(?:\d{1,3}\.){3}\d{1,3}/
end
def fileread
if File.exists?(@file)
@arr << regex(@file).to_s
begin
@arr.each do |ip|
sock = Socket.new(:INET, :STREAM)
sockaddr = Socket.sockaddr_in(@port, ip.to_i)
puts "Host: #{ip}:#{@port} Open" if sock.connect(sockaddr)
next
end
rescue Errno::ECONNREFUSED
false
end
end
end
端
除了一件事,代码似乎几乎完全有效。它打印出成功文本,即#34;主持人:#{ip}:#{@ port}打开&#34;。问题是它打印出#{ip}所在的整个数组,如下所示:[&#34; xx.xx.xx.xx&#34;,&#34; xx.xx.xx.xx&#34; ,&#34; xx.xx.xx.xx&#34;]:22打开。
它似乎与脚本中的.to_s和.to_i有关,但如果没有这些,它就完全无法工作。
答案 0 :(得分:0)
从我所看到的你只是在@arr变量中添加一个东西......
@arr << regex(@file).to_s
regex()调用string.scan()返回一个数组(可能是你的3个IP
然后你将数组转换为字符串并将字符串附加到@arr。
要么
@arr = regex(@file) # replace
或
@arr += regex(@file) # concatenate