Накопились в хранилище зимбры несколько десятков гигов старых сообщений, которые почему-то не прибились при автоматической чистке почтовых ящиков.
Меня смутил их размер - самих файлов с сообщениями, поэтому решил посмотреть в общих чертах, что там внутри. Через штатный просмотрщик MC сообщения показываются нормально, но он не умеет парсить структуру SMTP, поэтому я такие сообщения скопировал в свой сетевой каталог, дабы глянуть их через Thunderbird.
Копировал с помощью rsync. Сразу удивило, что, несмотря на использование опции -z, ускорения передачи не было, словно копировались уже сжатые данные. Ну да ладно, это не критично.
Захожу в FAR-e из-под винды в этот каталог, открываю первый попавшийся файл и выпадаю в осадок: внутри просто мусор. Открываю этот же файл через MC на сервере, куда его скопировал - MC показывает нормальные внутренности письма.
Копирую файл на свой локальный диск - внутри мусор. Копирую этот "мусор" обратно на самбу - MC показывает всё как положено.
Уже начал подозревать, что умудрился каким-то непонятным образом поймать вирус-шифровальщик, причем очень хитрый, который шифрует файл не на диске, а при открытии, в реальном времени. На всякий случай тот же самый файл из того же самого каталога попробовал открыть на другой машине с другой ОС и другим пользователем. Мусор.
Скажу честно, я растерялся. Растерянности добавило и то, что среди нескольких файлов сообщений небольшого размера, где-то до 10К, часть читается нормально, а часть содержит всё тот же мусор.
Всё оказалось проще. Выяснилось, что большинство сообщений хранится в виде GZIP. MC-шный просмотрщик молча распаковывает эти архивы, благодаря чему я вижу их исходное состояние, а вот FAR под такую подлянку не заточен:
Вот что говорит file про эти сообщения:
А вот то же самое с ключиком -z ("попытаться проверить содержимое сжатых файлов")
Остался вопрос: как же мне посмотреть, эти сообщения, если часть из них сжатые, а часть - нет? Можно, конечно, натравить gunzip на все файлы в каталоге, и пусть себе выдает ошибки на несжатых, но это не труЪ.
Как говорил мой бывший начальник в отделе автоматизации: "мы называемся "отдел автоматизации", а значит наша задача - автоматизировать всё, что можно". Я не возражал тогда, не возражаю и сейчас, поэтому, убедившись что в однострочной команде это писать неудобно, слепил простенький скрипт, который переварил и обработал всю эту массу.
Меня смутил их размер - самих файлов с сообщениями, поэтому решил посмотреть в общих чертах, что там внутри. Через штатный просмотрщик MC сообщения показываются нормально, но он не умеет парсить структуру SMTP, поэтому я такие сообщения скопировал в свой сетевой каталог, дабы глянуть их через Thunderbird.
Копировал с помощью rsync. Сразу удивило, что, несмотря на использование опции -z, ускорения передачи не было, словно копировались уже сжатые данные. Ну да ладно, это не критично.
Захожу в FAR-e из-под винды в этот каталог, открываю первый попавшийся файл и выпадаю в осадок: внутри просто мусор. Открываю этот же файл через MC на сервере, куда его скопировал - MC показывает нормальные внутренности письма.
Копирую файл на свой локальный диск - внутри мусор. Копирую этот "мусор" обратно на самбу - MC показывает всё как положено.
Уже начал подозревать, что умудрился каким-то непонятным образом поймать вирус-шифровальщик, причем очень хитрый, который шифрует файл не на диске, а при открытии, в реальном времени. На всякий случай тот же самый файл из того же самого каталога попробовал открыть на другой машине с другой ОС и другим пользователем. Мусор.
Скажу честно, я растерялся. Растерянности добавило и то, что среди нескольких файлов сообщений небольшого размера, где-то до 10К, часть читается нормально, а часть содержит всё тот же мусор.
Всё оказалось проще. Выяснилось, что большинство сообщений хранится в виде GZIP. MC-шный просмотрщик молча распаковывает эти архивы, благодаря чему я вижу их исходное состояние, а вот FAR под такую подлянку не заточен:
Вот что говорит file про эти сообщения:
# file 1583-5345.msg
1583-5345.msg: gzip compressed data, from FAT filesystem (MS-DOS, OS/2, NT)
А вот то же самое с ключиком -z ("попытаться проверить содержимое сжатых файлов")
# file 1583-5345.msg -z
1583-5345.msg: smtp mail, ASCII text, with CRLF line terminators (gzip compressed data, from FAT filesystem (MS-DOS, OS/2, NT))
Остался вопрос: как же мне посмотреть, эти сообщения, если часть из них сжатые, а часть - нет? Можно, конечно, натравить gunzip на все файлы в каталоге, и пусть себе выдает ошибки на несжатых, но это не труЪ.
Как говорил мой бывший начальник в отделе автоматизации: "мы называемся "отдел автоматизации", а значит наша задача - автоматизировать всё, что можно". Я не возражал тогда, не возражаю и сейчас, поэтому, убедившись что в однострочной команде это писать неудобно, слепил простенький скрипт, который переварил и обработал всю эту массу.
#!/bin/bash
# В этих путях конечный слэш не указываем: привычка, чтобы потом не пришлось его
# убирать где-нибудь в ходе выполнения
INDIR=/путь/к/каталогу/с/исходными/файлами
OUTDIR=/куда/копировать/обработанные/файлы
# Мне это необходимо - назначить права для доступа, если вам не нужно,
# уберите chown в конце скрипта.
RIGHTS="пользователь:группа"
# Проходим по всем сообщениям в каталоге. Обработка подкаталогов не предусмотрена.
for a in $INDIR/*.msg; do
# просто для красоты. Можно отключить для небольшого ускорения.
echo $a
# Имя файла без расширения используется в 3 местах, лучше использовать
# переменную, а не дёргать basename трижды
MESNAM=$(basename $a .msg)
# Узнаём, что это за файл - gzip или нет?
file "$a"|grep -q gzip>/dev/null
# Это присвоение не обязательно, но я предпочитаю гарантированно сохранить
# в переменной результат последней операции
DO=$?
# если grep -q нашел подстроку "gzip", тогда будет возвращён ноль
if [[ $DO -eq 0 ]]
then
# Распаковываем архив в нужное место, меняя расширение
gunzip -dc $a>$OUTDIR/$MESNAM.eml
else
# Не-архив просто копируем туда же
cp $a $OUTDIR/$MESNAM.eml
fi
# Если необходимо, назначаем соответствующие права
chown "$RIGHTS" $OUTDIR/$MESNAM.eml
done
Вот как-то так...
Комментариев нет:
Отправить комментарий
Пожалуйста, воздержитесь от грубостей и персональных нападок.
Я не против матерщины, но она должна быть уместной и использоваться для выражения эмоций, а не в качестве основного средства выражения мыслей.