Попытка преобразовать конфигурацию системы в более удобный для сравнения формат с помощью awk или sed

they only work if /var/mychroot is a mount point, so they fail if /var/mychroot is just a subdirectory within the / filesystem.

Вы можете сделать любой каталог точкой монтирования:mount --rbind /var/mychoot /var/mychoot.

Этот шаг -и другие, которые вам понадобятся -, описаны здесь:

Как выполнить chroot с пространствами имен Linux?

In fact I want to prevent all kinds of chroot escapes

Объедините вышеуказанное с пространствами имен пользователей.

В качестве альтернативы, seccomp. Вот как Docker предотвращает вызов содержащихся процессов, например, mount(). (Когда вы монтируете блочное устройство во второй раз, вы получаете второе представление этой файловой системы, что более или менее считается побегом ). В списке разрешенных системных вызовов Docker -root есть множество различных способов экранирования.

https://docs.docker.com/engine/security/seccomp/

https://github.com/moby/moby/blob/master/profiles/seccomp/default.json

0
04.03.2021, 22:45
1 ответ

Формат напоминаетmtreeформат конфигурации (см. здесь для примера этого ).

Следующая awkпрограмма переформатирует данные в новый формат, который вы упомянули. Предполагается, что каждый раздел имеет отступ, кратный четырем пробелам, но вы должны иметь возможность изменить переменную FSс " {4}"на "\t", чтобы вместо этого использовать отдельные табуляции.

BEGIN { FS = " {4}" }

$NF == "exit" { next }

NF > nf {
        section[++nf] = $NF
        next
}

function output() {
        $0 = ""
        for (i = 1; i <= nf; ++i)
                $i = section[i]
        print
}

{
        hold = $NF
        hold_nf = NF

        output()

        nf = hold_nf
        section[nf] = hold
}

END { output() }

Переменная nf— это количество полей в текущем разделе, что означает количество «сегментов» в строке конфигурации. Массив sectionсодержит текущее nfколичество полей.

Это блоки в коде:

  • BEGIN:Этот блок просто инициализирует разделитель полей ввода FSрасширенным регулярным выражением, соответствующим ровно четырем пробелам.

  • $NF == "exit":Этот блок пропускает строки, которые просто говорят «выход». Оказывается, эти (нам не нужны, раздел заканчивается меньшим отступом, чем предыдущий ).

  • NF > nf:Этот блок увеличивает nfи добавляет данные в конце текущей входной строки к последнему полю нашего массива section. Мы вызываем nextв конце блока, чтобы пропустить дальнейшую обработку этой строки ввода.

  • function output():Это функция, которая выводит текущий раздел, когда мы его вызываем. Мы вызываем его из следующих двух блоков.

  • Безусловный блок :Если мы попадаем сюда, то текущий раздел должен быть выведен (текущий раздел закончился или, по крайней мере, не подразделяется дальше ). Мы делаем это, вызывая нашу функцию output(). Поскольку нам по-прежнему нужно собирать и сохранять данные в этой строке ввода, а также поскольку output()сбрасывает текущую входную запись ($0), мы сохраняем данные, которые хотели бы сохранить, в hold. То же самое делаем со значением NF, которое может быть ниже нашего nf.

  • END:В конце ввода последний раздел конфигурации еще не выведен.Это можно сделать здесь, позвонив по номеру output().

Проверка на данных, указанных в вопросе:

$ awk -f script file
config system security tacacs server 1.1.1.1 port 88
config system security tacacs profile "default"
config system security user "one" profile "admin" "reports"
config system security user "one" password "E$OITGJ@vf2m92;l3j1"
config system security user "one" home /home/one
config system logs log 1 data foo
config system logs log 1 data bar
1
18.03.2021, 22:27

Теги

Похожие вопросы