【问题标题】:How to extract data from JSON converted from ruby script?如何从 ruby​​ 脚本转换的 JSON 中提取数据?
【发布时间】:2021-02-14 03:44:21
【问题描述】:

How to convert a ruby file to json?

我使用上述方法(rb2json0.rb 在上面的链接中)将 ruby​​ 脚本转换为 JSON。但是 JSON 的格式不是很好,因为它只有数组而没有字典,因此很难处理 JSON 输出。

我特别想提取update_info中的字段,例如,

  • 姓名
  • 说明
  • 许可证
  • 参考文献
  • 作者

并提取register_options中的字段,例如,

  • 主机
  • 来源
  • 文件名
  • 医生

请注意,提取不应假定字段名称固定为这些特定名称,因为其他字段名称可以在其他类似文件中使用。

输出应为双列 TSV,第一列为字段名称,第二列为字段值。例如,

Name<TAB>Microsoft Word UNC Path Injector
...

谁能告诉我最好的jq 方法来实现这一点?谢谢。

word_unc_injector.rb 位于 https://github.com/rapid7/metasploit-framework/blob/master/modules/auxiliary/docx/word_unc_injector.rb

$ rb2json0.rb < word_unc_injector.rb | jq . # too long to include all output.
[
  "program",
  [
    [
      "command",
      [
        "@ident",
        "require",
        [
...

编辑。这个问题的完整解决方案可能很复杂。但第一步可能是提取与update_info 对应的部分。这是相关的 JSON 片段。

...
                        [    
                          "method_add_arg",
                          [    
                            "fcall",
                            [    
                              "@ident",
                              "update_info",
                              [    
                                24,  
                                10   
                              ]    
                            ]    
                          ],   
                          [    
                            "arg_paren",
                            [    
                              "args_add_block",
                              [    
                                [    
                                  "var_ref",
                                  [    
                                    "@ident",
                                    "info",
                                    [    
                                      24,  
                                      22   
                                    ]    
                                  ]    
                                ],   
                                [    
                                  "bare_assoc_hash",
                                  [    
                                    [    
                                      "assoc_new",
                                      [    
                                        "string_literal",
                                        [    
                                          "string_content",
                                          [    
                                            "@tstring_content",
                                            "Name",
...

【问题讨论】:

  • 输出可能太长而无法包含在内,因此如果您可以创建一个简短但完整的说明性和信息性示例,以便将 JSON 转换为更有用的形式,将会很有帮助。
  • 能否下载文件 word_unc_injector.rb 并使用 rb2json0.rb 生成 JSON 文件?问题在于复杂性。每当我简化它时,它就不再复杂了。
  • 看起来您要求 Ruby 程序员为您完成工作,因此您可能至少应该添加一个“ruby”标签。如果您需要 jq 方面的帮助,最好从 JSON 的角度陈述需求,并提供一个完整但简短的示例。
  • 没有。这是一个jq问题。我已经将问题从 ruby​​ 转换为 jq。输入的描述必须根据原始 ruby​​ 文件,因为原始 ruby​​ 代码比转换后的 JSON 文件更具可读性。

标签: json jq


【解决方案1】:

以下说明如何将 rb2json0.rb 生成的面向数组的 JSON 转换为更面向对象的 JSON,以便您可以直接查询 update_info@ident

def objectify:
  if type == "array"
  then if length>=2 and (.[0]|type) == "string" and (.[1]|type) == "array"
       then  {(.[0]): ( .[1:] | map(objectify)) | objectify }
       elif length>=3 and .[0][0:1] == "@" and (.[1]|type) == "string"
       then  { (.[1] + .[0]): ( .[2:] | map(objectify)) | objectify }
       else map(objectify)
       end
  else . 
  end;

说明性查询

给定所示的 sn-p,以下会产生如下所示的输出:

objectify | .. | objects | .["update_info@ident"]? // empty
输出
[[24,10]]

【讨论】:

    猜你喜欢
    • 2020-04-09
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多