Вопрос или проблема
У меня есть проблема, и я описал её здесь https://wordpress.stackexchange.com/q/427620/253807.
Кратко: изображения из WP случайным образом отсутствуют на сервере, хотя они хранятся в базе данных. Я уверен, что это происходит через приложение, а не по вине какого-либо пользователя.
Я подумываю о внедрении скрипта для записи того, когда изображение из определённой папки удаляется с сервера. Я хочу узнать, какое приложение удаляет его как можно подробней.
Всё, что мне нужно, это несколько логов. Это возможно, и как это сделать?
ОБНОВЛЕНИЕ
У меня нет прав root на сервере, лучше рассматривать это как общий хостинг на Cpanel.
Это возможно, используя подсистему Linux auditd…
Отредактируйте /etc/auditd/rules.d/audit.rules
, чтобы он содержал как минимум следующее:
## Первое правило - удалить всё
-D
## Увеличьте буферы, чтобы выдерживать стрессовые события.
## Сделайте это больше для загруженных систем
## по умолчанию было 8192; это * 1024
-b 8388608
## Это определяет, как долго ждать в период всплеска событий
--backlog_wait_time 60000
## Установите режим сбоя в syslog
## 0 = без звука; 1 = syslog; 2 = ядерный паник, выключение системы
-f 0
## здесь конкретные правила для захвата удаления
# настройте auid на auid >=0 или в пределах определенного диапазона, если вы считаете, что это необходимо для нахождения виновного; однако это может увеличить audit.log до гигабайтов за считанные секунды
-a always,exit -F arch=b32 -S rename,unlink,rmdir,renameat,unlinkat -F auid>=1000 -F auid!=unset -k DELETIONS
-a always,exit -F arch=b64 -S rename,unlink,rmdir,renameat,unlinkat -F auid>=1000 -F auid!=unset -k DELETIONS
Также посмотрите на /etc/audit/auditd.conf
, но конфигурация по умолчанию обычно приемлема; возможно, измените или установите log_format = ENRICHED
в этом файле.
systemctl enable auditd
service auditd start # если вы не предпочитаете перезагрузку
service auditd status -l # проверьте, что auditd работает и правила audit.d действительны
Логи удаления будут записываться в /var/log/audit/audit.log
или в том, что установлено в log_file=
в auditd.conf
.
Ищите в audit.log
по ключевому слову DELETIONS
или чему-то, что указано как -k
в этом правиле.
И для правил вы также можете установить правило watch для определенных папок/файлов; например, -w /var/log -p wa -K WATCHKEY
Ответ или решение
Как отследить, какой процесс приложения удаляет файл с сервера?
Когда на сервере возникают проблемы с исчезновением изображений из папок, особенно в контексте использования WordPress, важно понимать, какой именно процесс или приложение вызывает эту проблему. В условиях, когда у вас нет прав администратора (root-доступа), решения могут быть ограничены, но все-таки есть подходящие методы для мониторинга и логирования удаления файлов.
1. Используйте встроенные возможности PHP
Так как вы находитесь на общем хостинге с доступом только к cPanel, вы можете использовать PHP-сценарий для отслеживания действий с файлами. Вы можете создать скрипт, который будет записывать информацию в лог-файл каждый раз, когда происходит удаление файла. Вот пример простого подхода:
<?php
function deleteFile($filePath) {
if (file_exists($filePath)) {
// Логируем информацию о удалении
file_put_contents('deletion_log.txt', date('Y-m-d H:i:s') . " - Удалён файл: $filePath от пользователя: {$_SERVER['REMOTE_ADDR']}\n", FILE_APPEND);
// Удаляем файл
unlink($filePath);
return true;
}
return false;
}
Этот подход позволяет вам контролировать удаление файлов, добавляя соответствующий лог для последующего анализа. Однако, учтите, что это решение требует, чтобы все операции удаления проходили именно через этот скрипт.
2. Использование функций хостинга
В некоторых случаях хостинг-провайдеры предоставляют инструменты для отслеживания действий пользователей. В cPanel могут быть доступны функции, такие как "File Manager", которые имеют собственные возможности логирования. Обратитесь в службу поддержки вашего хостинга, чтобы узнать, могут ли они предоставить какие-либо логи, которые бы помогли в определении процесса, удаляющего файлы.
3. Создание мониторинга с помощью скрипта на cron
Если у вас есть доступ к созданию cron-заданий, вы можете создать периодический скрипт, который будет проверять, какие файлы были удалены из папки. Например:
#!/bin/bash
# Путь к папке, которую вы отслеживаете
MONITOR_DIR="/path/to/your/directory"
# Файл для хранения списка текущих файлов
CURRENT_FILES="/tmp/current_files.txt"
# Сохранить текущие файлы в массив
ls $MONITOR_DIR > $CURRENT_FILES
# Проверить наличие файлов в списке
if [[ -f "last_files.txt" ]]; then
if [[ "$(diff last_files.txt $CURRENT_FILES)" != "" ]]; then
echo "Удаление или изменение файлов произошло:" >> deletion_log.txt
diff last_files.txt $CURRENT_FILES >> deletion_log.txt
fi
fi
# Обновить файл последнего состояния
cp $CURRENT_FILES last_files.txt
Этот скрипт будет сравнивать текущий список файлов с предыдущим и записывать изменения в лог.
Заключение
Отслеживание удаления файлов на сервере требует определенных решений, особенно если у вас ограниченный доступ. Используя вышеописанные подходы, вы сможете хоть как-то контролировать и фиксировать: какие файлы были удалены, в какое время и какой процесс потенциально мог это сделать. Важно понимать, что в условиях совместного хостинга возможности контроля будут ограничены по сравнению с полнофункциональными серверами.
Если у вас возникнут дополнительные вопросы или потребуется помощь в реализации данных решений, не стесняйтесь обращаться за консультацией.