Всем добрый день. Нужна ваша помощь. Дали задание создать скрипт на языке Bash, который в режиме реального времени отслеживает изменение прав доступа на несколько конечных файлов в поддереве указанного каталога и выводит информацию про изменение в файл и терминал. В качестве аргументов скрипту я передаю адрес каталога и имена файлов (пример аргументов: /home/computer/myfolder file2.txt file1.txt some.txt).
Код рабочий, но есть проблема. В некоторых случаях при выполнении скрипт моментально выдает, что права доступа изменились. При этом я права доступа не менял. Не знаю с чем это связано. Вроде бы когда файл только создан с правами доступа по умолчанию, то работает нормально. Как только изменяю на другие и заново запускаю скрипт, то выдает, что права доступа изменились. А также например, если я передаю файлы в порядке «file2.txt file1.txt some.txt», то проблема сохраняется. Если я передаю файлы в порядке «file1.txt file2.txt some.txt», то такой проблемы не возникает (some.txt находится в подкаталоге указаного каталога).
Есть подозрение, что тут присутствует какая-то проблема с порядком значений в массивах, возникает путаница с индексами. Но где именно понять не могу.. Помогите минимально изменить код чтоб все нормально работало.
Код скрипта:
#!/bin/bash
# Первый аргумент – путь к каталогу, который будет проверяться
dir_path="$1"
shift
# Проверка, существует ли заданный каталог и не пустует ли
if [ ! -d "$dir_path" ] || [ -z "$dir_path" ]; then
echo "Неправильно заданный каталог!"
exit 1
fi
# Список файлов для проверки
file_list=("$@")
# Проверка, пустой ли список файлов
if [ ${#file_list[@]} -eq 0 ]; then
echo "Отсутствует список файлов для проверки!"
exit 1
fi
# Ассоциативный массив для сохранения путей к файлам
declare -A file_paths
# Поиск путей к файлам в каталоге и его подкаталогах
for file in "${file_list[@]}"; do
file_paths["$file"]=$(find "$dir_path" -path "*/$file" -print -quit)
# Проверка, был ли найден файл
if [ -z "${file_paths["$file"]}" ]; then
echo "Файл $file не найден в $dir_path и подкаталогах"
exit 1
fi
done
# Имя файла журнала изменений прав доступа
log_file="permissions_log_$(date +%Y%m%d_%H%M%S).txt"
touch "$log_file"
# Массив для сохранения старых прав доступа к файлам
old_perm=()
# Запись старых прав доступа к файлам
for file in "${!file_paths[@]}"; do
old_perm+=("$(stat -c '%a' "${file_paths[$file]}")")
done
# Бесконечный цикл для проверки прав доступа с определенной задержкой
while true; do
new_perm=()
for i in "${!file_list[@]}"; do
file="${file_list[$i]}"
new_perm+=("$(stat -c '%a' "${file_paths[$file]}")")
# Сравнение новых и старых прав доступа
if [ "${new_perm[$i]}" != "${old_perm[$i]}" ]; then
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
# Вывод сообщения об изменении прав доступа и запись в журнал
echo "$timestamp | Права доступа для файла $file из каталога ${file_paths[$file]} изменились с ${old_perm[$i]} на ${new_perm[$i]}"
echo "$timestamp | Права доступа для файла $file из каталога ${file_paths[$file]} изменились с ${old_perm[$i]} на ${new_perm[$i]}" >> "$log_file"
old_perm[$i]="${new_perm[$i]}"
fi
done
sleep 1
done