Как перехватить команды bash или системные вызовы, чтобы сохранить расширенные атрибуты файла?
Я написал резервную систему в зависимости от расширенных атрибутов файла. Многие программы редактирования (например, vim) удаляют эти атрибуты из файлов, которые они редактируют. Моя идея состоит в том, чтобы перехватить любую команду bash, ссылающуюся на файл, чтобы атрибуты были сохранены в переменном или временном файле. Затем post-command-hook перезагружает эти атрибуты. Я обнаружил, что можно выполнить произвольную команду до и после каждой команды bash, используя trap, т.е. добавив:
trap date DEBUG
в.bashrc запустит команду date перед любой командой bash. Однако я не смог ограничить это командами bash, работающими с файлом, и получить имя файла. Я хотел бы иметь возможность написать что-то вроде этого:
trap 'getfattr -d {} > /tmp/{}.xattr' FILECOMMAND
FILECOMMAND подразумевает, что эта ловушка выполняется только для команд, работающих с файлом
{} будет абсолютным путем к файлу, с которым работает
Можно написать еще один хук после команды, чтобы переопределить атрибуты файла {} с содержимым /tmp/ndom‹.xattr
Это как-то возможно?
Другая расплывчатая идея - перехватывать системные вызовы, записывать в файлы и выполнять некоторый код в методах перехвата, сохраняя атрибуты файла.
Любой конструктивный вклад будет высоко оценен.
1 ответ
В итоге я написал скрипт на python, который заставляет данную команду c сохранять атрибуты файлов любых файлов, которые c получает в качестве аргумента.
Это достигается путем изменения этого шаблона и добавления его в файл.bashrc пользователей:
#preserve xattr for <COMMAND_NAME>
alias <COMMAND_NAME>='<FUNCTION_NAME>'
function <FUNCTION_NAME> ()
{
#find files in attribute list
for arg in "$@"
do
filesToPreserve=()
if [ -f "$arg" ];
then
#printf "argument: %s seems to be a file -> preserving attributes\n"
filesToPreserve+=("$arg")
fi
done
#save xattr
tempPathes=()
for file in "${filesToPreserve[@]}"
do
tempPath="/tmp/$file.attr"
getfattr -d "$file" > "$tempPath"
tempPathes+=("$tempPath")
done
#run actual command
<COMMAND_PATH> "$@"
#restore xattr
for p in "${tempPathes[@]}"
do
setfattr --restore="$p"
done
}
Сценарий Python для этого можно найти на моем github: xAttri