От man 7 regex
:
Выражение скобки является списком символов, включенных в" []". …
… Для включения литерала '-', делают он первый или последний знак …. ll другие специальные символы, включая' \', теряют их специальное значение в рамках выражения скобки.
Попытка regexp с egrep дает ошибку:
$ echo "username : username usergroup" | egrep "^([a-zA-Z0-9\-_]+ : [a-zA-Z0-9\-_]+) (usergroup)$"
egrep: Invalid range end
Вот более простая версия, которая также дает ошибку:
$ echo 'hi' | egrep '[\-_]'
egrep: Invalid range end
С тех пор \
не является особенным, который является диапазоном, точно так же, как [a-z]
был бы. Необходимо поместить Ваш -
в конце, как [_-]
или:
echo "username : username usergroup" | egrep "^([a-zA-Z0-9_-]+ : [a-zA-Z0-9_-]+) (usergroup)$"
username : username usergroup
Это должно работать независимо от Вашей libc версии (или в egrep или в ударе).
править: Это на самом деле зависит от Ваших настроек локали также. Страница справочника действительно предупреждает об этом:
Диапазоны очень зависимы от сортирующей последовательности, и портативные программы должны постараться не полагаться на них.
Например:
$ echo '\_' | LC_ALL=en_US.UTF8 egrep '[\-_]'
egrep: Invalid range end
$ echo '\_' | LC_ALL=C egrep '[\-_]'
\_
Конечно, даже при том, что это не сделало ошибки, это не делает то, что Вы хотите:
$ echo '\^_' | LC_ALL=C egrep '^[\-_]+$'
\^_
Это - диапазон, который в ASCII, включает \
, [
, ^
, и _
.
я попробую специально ответить на вопрос 3 здесь, так как кажется, что вы нашли конфигурационную часть fail2ban, которая отвечает на вопросы 1 и 2. Если Вы хотите усилить безопасность на SSH, я рекомендую следующее.
Чтобы ответить на ваши вопросы, вам необходимо создать конфигурацию ssh в файле /etc/fail2ban/filter.d/ssh.conf и вставить следующее....
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 6
Если вы уже изменили свой порт, как я предлагал, вы можете установить номер порта здесь. Перезапустите fail2ban и протестируйте.