Как перехватить команды 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

Другие вопросы по тегам