Bash-скрипт grep -E «[a-z, A-Z, 0-9 \. \ -] {2,}» / etc / hostname

Два варианта:

Локальное ведение журнала (но учетная запись root может так или иначе стереть файлы)

Вы можете использовать chattr + a в каталоге, чтобы добавить его только . Но, к сожалению, этот атрибут не наследуется для новых файлов и каталогов ( Каков эффект «chattr + a» на каталог ).

chattr -R +a /var/log/sudo-io

Затем вы можете использовать инструмент, который использует функцию inotify ядра, чтобы установить атрибуты только добавить для новых файлов и каталогов (см .: Автоматически устанавливать атрибут добавления для вновь созданных файлов / папок? ). (здесь, вероятно, есть временная атака)

SELinux, безусловно, может помочь ограничить здесь привилегированную учетную запись! ( staff_u и sysadm_u не могут получить доступ к журналам)

Удаленное ведение журнала

К сожалению, структура и формат файлов журналов затрудняют пересылку с использованием syslog (5 файлов за сеанс):

/var/log/sudo-io
/var/log/sudo-io/seq
/var/log/sudo-io/00
/var/log/sudo-io/00/00
/var/log/sudo-io/00/00/02
/var/log/sudo-io/00/00/02/stdout
/var/log/sudo-io/00/00/02/log
/var/log/sudo-io/00/00/02/timing
/var/log/sudo-io/00/00/02/stderr
/var/log/sudo-io/00/00/02/ttyout
/var/log/sudo-io/00/00/01
/var/log/sudo-io/00/00/01/stdin
/var/log/sudo-io/00/00/01/stdout
/var/log/sudo-io/00/00/01/log
/var/log/sudo-io/00/00/01/timing
/var/log/sudo-io/00/00/01/ttyin
/var/log/sudo-io/00/00/01/stderr
/var/log/sudo-io/00/00/01/ttyout

Было бы легко записать файлы журнала на удаленный сервер, установив каталог, указанный sudo iolog_dir , на удаленный сервер с помощью NFS / CIFS. Для экспортированного каталога NFS потребуется chattr + , как указано выше.

Очевидно, что этот сервер должен быть более безопасным, чтобы пользователь не мог подключиться к этому серверу и стереть там файлы :-).

Обратите внимание, что sudo откажется запускать , если не сможет создать файлы журнала: sudo: невозможно открыть / var / log / sudo-io / seq: В доступе отказано

5
26.03.2018, 01:26
3 ответа

{2,}является квантификатором, в этом случае он будет соответствовать от 2 до максимально возможного количества экземпляров букв в списке между [].

\.\-будет соответствовать ' -' или '.'. Эти два символа часто являются специальными, и их часто нужно экранировать с помощью \. Но внутри группы []точка не особенная, поэтому \в этом случае не нужна. Кроме того, -является индикатором диапазона и не является особенным, если он первый или последний в группе.

Итак, в конце концов вы могли бы использовать:

[,a-zA-Z0-9.-]{2,}
0
27.01.2020, 20:39

Вот что означает ваше регулярное выражение, слева направо:

[

начало набора символов (или класса символов ). Соответствует одному символу из набора.

a-z,A-Z,0-9

внутри набора символов означает соответствие любому одному символу a-z, A-Zили 0-9. Запятые на самом деле здесь необязательны, если только вы не пытаетесь буквально сопоставить запятую.

\.\-

.— это специальный символ, который соответствует любому символу, но внутри набора символов он не имеет особого значения, и его не нужно экранировать. Здесь -не нужно экранировать, если это первый или последний символ в наборе, он соответствует литералу -, он приобретает особое значение только тогда, когда находится между двумя другими символами в наборе.

]

конец набора символов. Набор соответствует любому одному символу a-z, или A-Z, или 0-9, или ., или -.

{2,}

является квантификатором. Это означает, что предыдущее регулярное выражение должно совпасть 2 или более раз.

Так что команду можно сократить до этой:

grep -E "[a-zA-Z0-9.-]{2,}" /etc/hostname

При использовании с флагом -Pgrep интерпретирует шаблон как регулярное выражение Perl. Регулярные выражения Perl почти идентичны регулярным выражениям Python. На мой взгляд, это более мощный режим, чем -E. В режиме Perl ваша команда становится:

grep -P "[a-zA-Z\d.-]{2,}" /etc/hostname
6
27.01.2020, 20:39

Чтобы понять, разбей на части:

  • группа

    Выполняется ли команда, прочтите man grepдля получения подробной информации.

  • Вызывает расширенный параметр регулярного выражения grep (, эквивалентный более старомуegrep)

  • "

    Рекомендуется заключать в кавычки, чтобы избежать расширений/интерпретаций оболочкой.

  • [

    Введите "выражение скобок" POSIX (, оканчивающееся следующим])

    A bracket expression (an expression enclosed in square brackets, "[]" ) is an RE that shall match a specific set of single characters.

  • a -z,A -Z,0 -9.-

    Набор одиночных символов для соответствия любому из этого списка:

    abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ,0123456789.-

    \явно указан в этом списке, он будет сопоставлен. Любой повторяющийся символ действует так, как если бы в списке был только один, поэтому два ,можно заменить одним ,. Я считаю, что \был дан по ошибке. Пользователь может полагать, что (точка).нуждается в экранировании (, как это обычно делается в регулярном выражении, но не внутри "выражения в квадратных скобках". Это описание диапазона (при условии, что обратная косая черта не предназначена для сопоставления ), может быть сокращено до (сохранить (тире)-в качестве последнего (или первого )символа):

    [a-zA-Z0-9.,-]
    

    Или (эквивалентно):

    [[:alnum:].,-]
    
  • {

    Ввести "интервальное выражение" (заканчивается следующим}):

    … an interval expression of the format "{m}", "{m,}", or "{m,n}", … it shall match … repeated consecutive occurrences …

    Таким образом, {2,}будет соответствовать количеству :от 2 до любого или :двух или более предыдущих элементов.

  • /etc/имя хоста

    Внутри файла /etc/hostname.

0
27.01.2020, 20:39

Теги

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