【问题标题】:Error when executing HoneyC - `require': cannot load such file执行 HoneyC 时出错 - `require':无法加载此类文件
【发布时间】:2019-07-16 14:16:40
【问题描述】:

我正在尝试执行 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 Local Address Foreign 地址 状态 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:*
听 - tcp 0 0 0.0.0.0:80
0.0.0.0:* 监听 - tcp 0 0 127.0.0.1:30900 0.0.0.0:* 监听 -
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>'

单元测试的ruby代码是:

 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)

我应该怎么做才能让这个蜜罐运行?

【问题讨论】:

    标签: ruby linux honeypot


    【解决方案1】:

    此代码库上的最新提交是从 2007 年开始的(并且正在将其转移到 git,我不确定原始的颠覆提交是否更早)。从那时起,Ruby 已经取得了长足的进步,而您正在运行的 UnitTester 依赖于一些多年来发生变化的元编程行为。它试图查看源代码树中的所有 ruby​​ 文件以加载它们以查找测试,但它的做法在现代 rubies 中不起作用。至少有两点不对:

    1. 从 2009 年发布的 ruby​​ 1.9 开始,当前目录不再(默认情况下)在加载路径中,所以当你尝试 require 一个在当前目录中定义的模块/类时,它'会失败。他们需要切换到require_relative (Why does Ruby 1.9.2 remove "." from LOAD_PATH, and what's the alternative?)

    2. 代码库在爬取对象树以试图找出定义了哪些类/模块时做了一些非常奇怪的事情(但可能曾经有必要)(https://github.com/honeynet/honeyc/blob/master/UnitTester.rb#L10)。这在现代红宝石中无法正常工作。

    您可以使用 ruby​​ 1.8.7 运行 UnitTest,但请注意,自 2017 年 4 月 1 日起,该版本的 ruby​​ 就不再受支持。单元测试大部分都通过了,除了一些正在查询不再存在的 Web 服务。

    我认为如果不进行大量工作升级它,你就不能真正使用这个代码库,这在这里可能是题外话。

    【讨论】:

    • 谢谢!这是有道理的。
    猜你喜欢
    • 2012-04-02
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 2014-05-27
    • 2016-01-24
    相关资源
    最近更新 更多