Санировать файлы журнала доступа Apache?

Разве это не должно быть похожим на это? A является файлом, или B является файлом, затем blabla.

if [[ -f /etc/benchmarking/code ]] || [[ -f /etc/benchmarking/code.class ]]; 
then  
  echo "match"
fi
2
17.08.2016, 14:26
2 ответа

Проблема здесь, Вы читаете из журнала Apache и пишете в него одновременно. Независимо от того, что Вы добавили к журналу, также возвращается в конвейер через cat звоните (никакая игра слов предназначенный :)). Это создает противный цикл позитивных откликов, который будет продолжать работать, пока Ваша файловая система не заполняется. Ответ на этот вопрос может быть интересен Вам о том, почему это происходит.

Как необходимо пойти об этом затем? Наивное решение состояло бы в том, чтобы изменить файл на месте как так:

for item in ${!values[@]};do
    sed -i "..." "$apacheLog"  #cat isn't needed here
done

и не передавайте вывод по каналу нигде: сам сценарий изменит файл на месте. Также см. ответ terdon для того, как сделать sed звоните только однажды (без цикла), чтобы повысить эффективность.

Проблема с этим подходом, однако, состоит в том, что живой сервер Apache будет, вероятно, регистрировать вещи в файл, поскольку Вы работаете над ним, и странные вещи могут начать происходить. Лучшее решение состояло бы в том, чтобы посмотреть в документации Apache для способов хранить уязвимую информацию из журналов.

Кстати, то, что Вы делаете, даже не санирует журналы: это добавляет санированные строки назад в (все еще испорченный) файл журнала.

3
27.01.2020, 22:06
  • 1
    Где OP добавляет назад к журналу? –  terdon♦ 02.10.2013, 18:47
  • 2
    @terdon "У нас есть этот код в сценарии оболочки, который передает вывод по каналу для Apache для входа" (шахта акцента). А-ч –  Joseph R. 02.10.2013, 18:47
  • 3
    , хорошо таким образом, они, вероятно, передавали по каналу назад в журнал, как Вы говорите. –  terdon♦ 02.10.2013, 18:51

В настоящий момент существуют различные улучшения, которые можно сделать. Во-первых, и наименее важный, у Вас есть бесполезное использование кошки. То, что намного более важно, - то, что Вы работаете sed многократно, каждый из которых распечатает весь файл. Я не действительно уверен, с чем Вы делаете grep, Вы пытаетесь распечатать только те строки, которые содержат определенную переменную?

Так или иначе один способ сделать вещи лучше состоял бы в том, чтобы работать sed однажды и имеют его, делают все замены. Что-то как:

replace=""
for item in ${!values[@]}
do
    ## build the sed line
    replace="s/${values[$item]}=[^&\t\n]*/${values[$item]}=***/g;$replace"
done

### run the replacement using sed's -i option so it 
### changes the original file
eval sed -i \""$replace"\" $apacheLog
0
27.01.2020, 22:06

Теги

Похожие вопросы