Назад | Перейти на главную страницу

Схема BNF для файла sudo

Как я могу создать (BNF) железная дорога диаграмма для /etc/sudoers файл?

Я знаю sudoers manpage имеет Расширенная форма Бэкуса-Наура информация. Также есть инструменты для создания таких диаграмм (см. Инструмент для создания железнодорожной диаграммы, используемый на json.org )

Вам нужно взять каждую часть схемы BNF со страницы sudo man, затем скопировать и вставить в свой любимый инструмент (Генератор железнодорожных схем (онлайн) или плагин dokuwiki EBNF).

Убедитесь, что у вас есть все фрагменты с действующей схемой (!). Также есть некоторые общие проблемы ...

+netgroup должен быть заменен на '+' netgroup (так как + суффикс для элементы, повторяющиеся 1 или более раз в некоторых вариантах БНФ).

Конечный обратный слеш (\) следует удалить.

/netmask следует заменить на '/'netmask (так как элементы, разделенные косой чертой ("/"), являются альтернативными в некоторых вариантах БНФ).

Вот RHEL / CEntOS 7 EBNF после этой очистки (плюс некоторые незначительные), которые вы можете вставить http://bottlecaps.de/rr/ui (вставьте вкладку «Редактировать грамматику», затем щелкните вкладку «Просмотр диаграммы»). код лицензия:


Alias ::= 'User_Alias'  User_Alias (':' User_Alias)* |
          'Runas_Alias' Runas_Alias (':' Runas_Alias)* |
          'Host_Alias'  Host_Alias (':' Host_Alias)* |
          'Cmnd_Alias'  Cmnd_Alias (':' Cmnd_Alias)*

User_Alias ::= NAME '=' User_List

Runas_Alias ::= NAME '=' Runas_List

Host_Alias ::= NAME '=' Host_List

Cmnd_Alias ::= NAME '=' Cmnd_List

NAME ::= [A-Z]([A-Z][0-9]_)*

User_List ::= User |
              User ',' User_List

User ::= '!'* user name |
         '!'* '#' uid |
         '!'* '%' group |
         '!'* '%#' gid |
         '!'* '+' netgroup |
         '!'* '%:' nonunix_group |
         '!'* '%:#' nonunix_gid |
         '!'* User_Alias

Runas_List ::= Runas_Member |
               Runas_Member ',' Runas_List

Runas_Member ::= '!'* user name |
                 '!'* '#' uid |
                 '!'* '%' group |
                 '!'* '%#' gid |
                 '!'* '%:' nonunix_group |
                 '!'* '%:#' nonunix_gid |
                 '!'* '+' netgroup |
                 '!'* Runas_Alias

Host_List ::= Host |
              Host ',' Host_List

Host ::= '!'* host name |
         '!'* ip_addr |
         '!'* network('/'netmask)? |
         '!'* '+' netgroup |
         '!'* Host_Alias

Cmnd_List ::= Cmnd |
              Cmnd ',' Cmnd_List

command name ::= file name |
                 file name args |
                 file name '""'

Cmnd ::= '!'* command name |
         '!'* directory |
         '!'* "sudoedit" |
         '!'* Cmnd_Alias

Default_Type ::= 'Defaults' |
                 'Defaults' '@' Host_List |
                 'Defaults' ':' User_List |
                 'Defaults' '!' Cmnd_List |
                 'Defaults' '>' Runas_List

Default_Entry ::= Default_Type Parameter_List

Parameter_List ::= Parameter |
                   Parameter ',' Parameter_List

Parameter ::= Parameter '=' Value |
              Parameter '+=' Value |
              Parameter '-=' Value |
              '!'* Parameter

User_Spec ::= User_List Host_List '=' Cmnd_Spec_List 
              (':' Host_List '=' Cmnd_Spec_List)*

Cmnd_Spec_List ::= Cmnd_Spec |
                   Cmnd_Spec ',' Cmnd_Spec_List

Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Tag_Spec* Cmnd

Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')'

SELinux_Spec ::= ('ROLE=role' | 'TYPE=type')

Tag_Spec ::= ('NOPASSWD:' | 'PASSWD:' | 'NOEXEC:' | 'EXEC:' |
              'SETENV:' | 'NOSETENV:' | 'LOG_INPUT:' | 'NOLOG_INPUT:' |
              'LOG_OUTPUT:' | 'NOLOG_OUTPUT:')