我正在尝试执行HoneyC,该代码位于此链接上:HoneyC Source Code。我遵循了“自述文件”文档中的说明,该说明指出必须先运行UnitTest。
它说:“将HoneyC发行版解压缩到一个目录中,cd进入该目录,然后执行'ruby UnitTester.rb'。这将启动执行一些基本模块测试的单元测试。(请注意,您需要网络连接并直接在端口80上进行出站访问以使单元测试成功。”“
我正在使用Ruby版本2.3.1p112(2016-04-26)[x86_64-linux-gnu]
*我以前从未使用过Ruby进行编程。
端口80似乎还可以...如果我运行命令netstat,我将得到:
:〜$ netstat -tulnap(并非所有进程都可以 确定的非拥有的过程信息将不会显示,您将拥有 成为root用户即可查看全部内容。)活动的Internet连接(服务器和 已建立)Proto Recv-Q Send-Q本地地址国外 地址状态PID /程序名称tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN-tcp 0 0 127.0.0.1:30800 0.0.0.0:*
LISTEN-tcp 0 0 0.0.0.0:80
0.0.0.0:* LISTEN-tcp 0 0 127.0.0.1:30900 0.0.0.0:* LISTEN-
tcp 0 0 127.0.1.1:53 0.0.0.0:*
听
但是,当我尝试运行UnitTest时出现以下错误:
:~/honeypot/honeyc-master$ ruby UnitTester.rb
/usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- HoneyCConfiguration (LoadError)
from /usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from UnitTester.rb:39:in `block in suite'
from /usr/lib/ruby/2.3.0/find.rb:49:in `block (2 levels) in find'
from /usr/lib/ruby/2.3.0/find.rb:48:in `catch'
from /usr/lib/ruby/2.3.0/find.rb:48:in `block in find'
from /usr/lib/ruby/2.3.0/find.rb:43:in `each'
from /usr/lib/ruby/2.3.0/find.rb:43:in `find'
from UnitTester.rb:29:in `suite'
from /usr/lib/ruby/vendor_ruby/test/unit/ui/testrunner.rb:12:in `initialize'
from /usr/lib/ruby/vendor_ruby/test/unit/ui/console/testrunner.rb:38:in `initialize'
from /usr/lib/ruby/vendor_ruby/test/unit/ui/testrunnerutilities.rb:24:in `new'
from /usr/lib/ruby/vendor_ruby/test/unit/ui/testrunnerutilities.rb:24:in `run'
from UnitTester.rb:54:in `<main>'
单元测试的红宝石代码为:
require 'test/unit/testsuite'
require 'test/unit/ui/console/testrunner'
require 'find'
module Kernel
def get_class_for_name(name, objects = [Object])
#STDERR.puts name.to_s
return nil if objects.size == 0
object = objects.shift
object.constants.each do |constant_name|
real_object = object.const_get(constant_name)
case real_object
when Class
return real_object if constant_name == name
when Module
objects << real_object
end
end
return get_class_for_name(name, objects)
end
end
class UnitTester
def self.suite
exceptions = ["HoneyC","UnitTester"]
suite = Test::Unit::TestSuite.new("HoneyC Unit Tests")
#find all rb files
Find.find(".") do |full_file_name|
if /.rb/ =~ full_file_name and !(/.svn/ =~ full_file_name)
/.*\// =~ full_file_name
path = $&[2..$&.length]
classname = full_file_name[$&.length..-4]
if !exceptions.index(classname)
#assume test is under classname + "Test"
#run unit test on them except on the exceptions
require path + classname
classname.sub!(/\.tab/,"") #silly replacement for the snortruleparser, since this is an automatically generated class.
unit_test = get_class_for_name(classname + "Test")
if(unit_test==nil)
STDERR.puts "No unit test defined for class " + classname + "."
else
suite << unit_test.suite
end
end
end
end
return suite
end
end
Test::Unit::UI::Console::TestRunner.run(UnitTester)
我应该怎么做才能使这个蜜罐运行?
答案 0 :(得分:1)
此代码库上的最新提交来自2007年(并且正在将其传输到git,我不确定原始的subversion提交是否更旧)。从那时起,Ruby已经走了很长一段路,而您正在运行的UnitTester依赖于多年来发生的某些元编程行为。它正在尝试查看源代码树中的所有ruby文件,以加载它们以查找测试,但是这样做的方式在现代ruby中不起作用。至少有两件事是错误的:
从2009年发布的ruby 1.9开始,当前目录(默认情况下)不再位于加载路径中,因此,当您尝试require
时在当前目录中定义的模块/类它会失败。他们需要切换到require_relative
(Why does Ruby 1.9.2 remove "." from LOAD_PATH, and what's the alternative?)
代码库在爬网对象树以试图找出已经定义了哪些类/模块(https://github.com/honeynet/honeyc/blob/master/UnitTester.rb#L10)方面做得很奇怪(但也许有必要)。这在现代红宝石中无法正常工作。
您可以在ruby 1.8.7上运行UnitTests,但是请注意,自2017年4月1日起不支持ruby版本。单元测试大部分通过,除了一些正在查询的Web服务不再存在。
我认为如果不进行大量工作就可以真正使用此代码库,而这可能不在本文的讨论范围之内。