Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python将sudoers文件转换为JSON数据?_Python_Json_Parsing_Sudoers - Fatal编程技术网

如何使用Python将sudoers文件转换为JSON数据?

如何使用Python将sudoers文件转换为JSON数据?,python,json,parsing,sudoers,Python,Json,Parsing,Sudoers,我正在为sudoers文件编写一个解析器,使其格式更易于我正在编写的程序阅读。我是Python的初学者,没有足够的经验来做我需要的事情 到目前为止,我有以下代码: #!/usr/bin/env python import operator import os import sys import re import json example_file = "./Sudoers_example.txt" try: column1 = [] column2 = [] col

我正在为sudoers文件编写一个解析器,使其格式更易于我正在编写的程序阅读。我是Python的初学者,没有足够的经验来做我需要的事情

到目前为止,我有以下代码:

#!/usr/bin/env python

import operator
import os
import sys
import re
import json

example_file = "./Sudoers_example.txt"
try:
    column1 = []
    column2 = []
    column3 = []

    with open(example_file) as f:
        for line in f:
            #result.append(re.split(r'\s+', line)[0:3])
            column1.append(re.split(r'\s+', line)[0])
            column2.append(re.split(r'\s+', line)[1])
            column3.append(re.split(r'\s+', line)[2])

        mergedDict = {'op':column1, 'runas':column2, 'cmds':column3}

        print(json.dumps(mergedDict, indent=4, sort_keys=False))

except Exception as ee:
    print(ee)
    sys.exit(-1)
这不能产生我想要的。这是一项正在进行的工作

尽管如此,我想看到的是:

{
    "hostname": "host.moo.com",
    "sudoers": [
        {
            "op": "operator1",
            "runas": "ALL=(ALL)",
            "cmds": "ALL"
        },
        {
            "op": "operator2",
            "runas": "ALL=(ALL)",
            "cmds": "ALL"
        }

    ]
}
我不确定下一步是什么。我应该如何进行

编辑,示例文件如下所示(根据请求):


您不需要在这里使用
re
,只需从文件中读取每一行并
split
即可

import json


js = {"hostname": "test", "sudoers":[]} # create json structure first
with open("/home/sufiyan/a") as f:
    for line in f:
        line = line.split() # split on every space character
        js["sudoers"].append({"op": line[0], "runas": line[1], "cmds": line[2]})


print(json.dumps(js))

# output,

{
  "sudoers": [
    {
      "runas": "ALL=(ALL)",
      "cmds": "ALL",
      "op": "root"
    },
    {
      "runas": "ALL=(ALL)",
      "cmds": "ALL",
      "op": "%group1"
    },
    {
      "runas": "ALL=(ALL)",
      "cmds": "ALL",
      "op": "operator1"
    },
    {
      "runas": "ALL=(ALL)",
      "cmds": "ALL",
      "op": "operator2"
    },
    {
      "runas": "ALL=(ALL)",
      "cmds": "ALL",
      "op": "%systems"
    }
  ],
  "hostname": "test"
}
我的两分钱(我加了一些评论):


您应该将其添加为词典列表。您的代码如下所示:

import operator
import os
import sys
import re
import json

example_file = "./Sudoers_example.txt"
sudoer_list = []
try:
    column1 = []

    with open(example_file) as f:
        for line in f:
            splits = re.split(r'\s+', line)
            sudoer_list.append({'op':splits[0], 'runas':splits[1], 'cmds':splits[2]})

        print(json.dumps(sudoer_list, indent=4, sort_keys=False))

except Exception as ee:
    print(ee)
    sys.exit(-1)
输出:

[
    {
        "op": "root",
        "runas": "ALL=(ALL)",
        "cmds": "ALL"
    },
    {
        "op": "%group1",
        "runas": "ALL=(ALL)",
        "cmds": "ALL"
    },
    {
        "op": "operator1",
        "runas": "ALL=(ALL)",
        "cmds": "ALL"
    },
    {
        "op": "operator2",
        "runas": "ALL=(ALL)",
        "cmds": "ALL"
    },
    {
        "op": "%systems",
        "runas": "ALL=(ALL)",
        "cmds": "ALL"
    }
]

您的示例文件是什么样子的?你能把它添加到问题中吗?@SufiyanGhori,把它添加到了主帖子中。谢谢你的快速回复以及所有其他回复者。我喜欢你做的重构。我真的认为我完全偏离了我的方向。又来了!感谢您的快速回复以及所有其他回复者。直到现在我才想到这些评论。好主意,哈哈,再次感谢!感谢您的快速回复以及所有其他回复者。早些时候我尝试过做类似的事情,但我想我需要一个dict来分配键和值。我试着在dict上使用append,但效果不错。谢谢你的指导。谢谢你的帮助!祝你的项目好运!
import operator
import os
import sys
import re
import json

example_file = "./Sudoers_example.txt"
sudoer_list = []
try:
    column1 = []

    with open(example_file) as f:
        for line in f:
            splits = re.split(r'\s+', line)
            sudoer_list.append({'op':splits[0], 'runas':splits[1], 'cmds':splits[2]})

        print(json.dumps(sudoer_list, indent=4, sort_keys=False))

except Exception as ee:
    print(ee)
    sys.exit(-1)
[
    {
        "op": "root",
        "runas": "ALL=(ALL)",
        "cmds": "ALL"
    },
    {
        "op": "%group1",
        "runas": "ALL=(ALL)",
        "cmds": "ALL"
    },
    {
        "op": "operator1",
        "runas": "ALL=(ALL)",
        "cmds": "ALL"
    },
    {
        "op": "operator2",
        "runas": "ALL=(ALL)",
        "cmds": "ALL"
    },
    {
        "op": "%systems",
        "runas": "ALL=(ALL)",
        "cmds": "ALL"
    }
]