Модули безопасности Linux предназначены для управления доступом к таким ресурсам, как файлы:
LSM was designed to provide the specific needs of everything needed to successfully implement a mandatory access control module... LSM inserts "hooks" (upcalls to the module) at every point in the kernel where a user-level system call is about to result in access to an important internal kernel object such as inodes and task control blocks.
Чтобы реализовать это, я думаю, вам придется создать драйвер устройства, который будет передавать такие события, как «open()
был вызван. VLC открывает zip-файл с видео в нем» пользователю -space, который разархивирует соответствующий файл и вернет имя разархивированного файла, которое ваш LSM-модуль затем передаст фактическому вызову ядра open
. А затем в соответствующем вызове close()
вы передадите это событие из вашего модуля LSM в процесс пользовательского пространства -, чтобы он мог удалить разархивированный видеофайл.
Это не тривиальное предприятие. Среди прочего, вам нужно быть очень осторожным, чтобы не создать огромные дыры в безопасности :"Эй, эту штуку можно использовать для перезаписи /etc/shadow
!"
Приведенный ниже сценарий выполняет некоторую проверку -входных данных (, ожидая ровно одну файловую систему, и она должна существовать ), а затем обнаруживает нужную информацию по шагам :
.lsfs
lslv
lsvg
Вот скрипт:
#!/bin/sh
# input: a filesystem
# output: free MB in the containing VG
if [ "$#" -ne 1 ]
then
printf "Usage: %s [ fs ]\n" "$0" >&2
exit 1
fi
if ! /usr/sbin/lsfs -c "$1" > /dev/null 2>&1
then
printf "Error: filesystem %s not found\n" "$1" >&2
exit 2
fi
lv=$(/usr/sbin/lsfs -c "$1" |
awk -F: 'NR == 2 {
split($2, fields, "/");
print fields[3]
}')
vg=$(LANG=C lslv "$lv" 2>/dev/null | awk '/VOLUME GROUP/ { print $6 }')
copies=$(LANG=C lslv "$lv" 2>/dev/null | awk '/^COPIES:/ {print $2}')
mb=$(LANG=C /usr/sbin/lsvg "$vg" |
awk -F: '/FREE PP/ {match($3, /\([[:digit:]]*/); print substr($3, RSTART+1, RLENGTH-1)}')
printf "%d Mb available\n" "$((mb / copies))"
Для описания некоторых разделов кода, которые могут быть неочевидными:
awk
для lsfs
разбивает вывод на двоеточия и работает только со строкой 2 (, поскольку строка 1 является заголовком ). Значение в поле 2 похоже на /dev/opcon
, поэтому мы разбили его на массив fields
на основе косой черты -. Первый элемент пуст (ничего перед первым /
), второй элемент — dev
, а третий элемент — opcon
, имя LV, которое нам нужно. awk
для lsvg
выделяет свободную -пробельную строку; третье поле, разделенное двоеточием -, представляет собой текст после FREE PPs:
, например. 217 (222208 megabytes)
. Мы вызываем match()
в этом поле, чтобы соответствовать (
, за которым следуют некоторые цифры. Здесь мы предполагаем успех! Поскольку совпадение начинается с открывающей скобки, когда мы извлекаем цифры для свободного мегабайта,мы пропускаем один после RSTART и вычитаем один из RLENGTH. Если вы планируете использовать выходные данные этого скрипта как часть другого конвейера, рассмотрите возможность настройки инструкции printf
для вывода только цифр без части «Доступно МБ\n».