Как узнать странного персонажа?

Один из способов — пометить трафик в iptables и сопоставить исходящий маршрут с политикой маршрутизации:

допустим, у вас есть шлюз1 и шлюз2 в одной локальной сети...

ip route flush table 3
ip route add table 3 
ip route add default via 

ip route flush table 4
ip route add table 4 
ip route add default via 

Пометить трафик в iptables:

iptables -t mangle -A PREROUTING   -s 10.0.0.0/24 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING   -s 10.1.0.0/24 -j MARK --set-mark 4

Вы можете сопоставить что угодно: адрес источника, адрес назначения или порт и т. д.

Поскольку вы явно переписываете исходный IP-адрес в iptables, а не полагаетесь на динамический IP-адрес шлюза, вы, вероятно, захотите использовать SNAT вместо MASQUERADE. См. Различия между SNAT и MASQUERADE

.

10
08.03.2018, 17:12
4 ответа

Ваш файл содержит два байта, EB и 0A в шестнадцатеричном формате. Вероятно, файл использует набор символов с одним байтом на символ, например ISO-8859-1; в этом наборе символов EB — это ë:

$ printf "\353\n" | iconv -f ISO-8859-1
ë

Другими кандидатами могут быть δ в кодовой странице 437 , Ù в кодовой странице 850 ...

Вывод od -x в этом случае сбивает с толку из-за порядка следования байтов; лучшим вариантом является -t x1, который использует одиночные байты:

$ printf "\353\n" | od -t x1
0000000 eb 0a
0000002

od -x отображается на od -t x2, который считывает два байта за раз, а на маленьких -endian выводит байты в обратном порядке.

Когда вы сталкиваетесь с таким файлом, который не является допустимым UTF-8 (или не имеет смысла при интерпретации как файл UTF-8), не существует надежного способа автоматически определить его кодировку (и набор символов). ). Контекст может помочь: если это файл, созданный на западном ПК за последние пару десятилетий, есть большая вероятность, что он закодирован в ISO-8859-1, -15 (европейский вариант) или Windows-1252; если он старше, вероятными кандидатами являются CP-437 и CP-850. Файлы из восточноевропейских, российских или азиатских систем будут использовать разные наборы символов, о которых я мало что знаю. Затем есть EBCDIC... iconv -l выведет список всех наборов символов, о которых знает iconv, и оттуда вы сможете действовать методом проб и ошибок.

(В какой-то момент я знал большую часть CP-437 и ATASCII наизусть, это были дни.)

22
27.01.2020, 19:59

Невозможно со 100% точностью угадать кодировку текстовых файлов.

Такие инструменты, как chardet, firefox, file -i, когда не задана явная информация о кодировке (например, если HTML содержит мета-кодировку =... в голове, все проще) попытается использовать эвристики, которые не так уж плохи, если текст достаточно большой.

Далее я демонстрирую обнаружение набора символов с помощью chardet (pip install chardet / apt-get install python-chardet при необходимости).

$ echo "in Noël" | iconv -f utf8 -t latin1  | chardet
<stdin>: windows-1252 with confidence 0.73

Получив хороший кандидат на кодировку, мы можем использовать iconv, recode или аналогичный чтобы изменить кодировку файла на вашу «активную» кодировку (в моем случае utf-8) и посмотреть, правильно ли она угадала...

iconv -f windows-1252  -t utf-8 file

Некоторые кодировки (например, iso-8859-3, iso-8859-1) содержат много символов в общем -- иногда нелегко понять, нашли ли мы идеальную кодировку...

Поэтому очень важно иметь метаданные, связанные с соответствующим текстом (например, XML).

2
27.01.2020, 19:59

Обратите внимание, что od — это сокращение от восьмеричный дамп, поэтому 005353 — это два байта восьмеричного слова, od -x — это 0aeb в шестнадцатеричном формате как слово, а фактическое содержимое вашего файла — это два байта eb и 0a в шестнадцатеричном формате, в этом порядке.

Таким образом, 005353 и 0aeb нельзя просто интерпретировать как "шестнадцатеричный код".

0a — перевод строки (LF), а eb зависит от вашей кодировки. файл просто угадывает кодировку, это может быть что угодно. Без какой-либо дополнительной информации, откуда взялся файл и т. д., это будет трудно выяснить.

5
27.01.2020, 19:59
#!/bin/bash
#
# Search in a file, a known (part of a ) String (i.E.: Begrüßung),
# by testing all encodings
#
[[ $# -ne 2 ]] && echo "Usage: encoding-finder.sh FILE fUnKy_CHAR_FOR_SURE_IN_FILE" && exit
FILE=$1
PATTERN=$2
for enc in $( iconv -l | sed 's/..$//') 
do 
    iconv -f $enc -t UTF-8 $FILE  2>/dev/null | grep -m 1 $PATTERN && echo $enc 
done 

Если я получу файл, который содержит, например, слово Begrung, я могу сделать вывод, что может иметься в виду Begrüßung. Поэтому конвертирую всеми известными кодировками и смотрю, не найдется ли такая, которая правильно конвертирует.

Обычно существует несколько подходящих кодировок.

Для более длинных файлов вы можете вырезать фрагмент вместо преобразования сотен страниц.

Так я бы назвал это

encodingfinder.sh FILE Begrüßung

и скрипт проверяет, преобразуя ли его с известными кодировками, какие из них производят "Begrüßung".

Чтобы найти таких персонажей, обычно помогает меньшее, так как причудливые персонажи часто выделяются. Из контекста обычно можно сделать вывод о правильном слове для поиска. Но мы не хотим проверять шестнадцатеричным редактором, что это за байт, а потом ходить по бесконечным таблицам кодировок, чтобы найти нашего обидчика.:)

0
27.01.2020, 19:59

Теги

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