Один из способов — пометить трафик в 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
.
Ваш файл содержит два байта, 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 наизусть, это были дни.)
Невозможно со 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).
Обратите внимание, что od
— это сокращение от восьмеричный дамп, поэтому 005353
— это два байта восьмеричного слова, od -x
— это 0aeb
в шестнадцатеричном формате как слово, а фактическое содержимое вашего файла — это два байта eb
и 0a
в шестнадцатеричном формате, в этом порядке.
Таким образом, 005353
и 0aeb
нельзя просто интерпретировать как "шестнадцатеричный код".
0a
— перевод строки (LF), а eb
зависит от вашей кодировки. файл
просто угадывает кодировку, это может быть что угодно. Без какой-либо дополнительной информации, откуда взялся файл и т. д., это будет трудно выяснить.
#!/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".
Чтобы найти таких персонажей, обычно помогает меньшее, так как причудливые персонажи часто выделяются. Из контекста обычно можно сделать вывод о правильном слове для поиска. Но мы не хотим проверять шестнадцатеричным редактором, что это за байт, а потом ходить по бесконечным таблицам кодировок, чтобы найти нашего обидчика.:)