# sudoers - default sudo security policy plugin - man(5) - [phpMan]

[_SUDOERS_(5)](https://www.chedong.com/phpMan.php/man/SUDOERS/5/markdown)                               File Formats Manual                              [_SUDOERS_(5)](https://www.chedong.com/phpMan.php/man/SUDOERS/5/markdown)

## NAME
       sudoers — default sudo security policy plugin

## DESCRIPTION
       The **sudoers **policy plugin determines a user's **sudo **privileges.  It is the default **sudo **policy
       plugin.   The  policy is driven by the _/etc/sudoers_ file or, optionally, in LDAP.  The policy
       format is described in detail in the “SUDOERS FILE FORMAT” section.  For information on stor‐
       ing **sudoers **policy information in LDAP, see [_sudoers.ldap_(5)](https://www.chedong.com/phpMan.php/man/sudoers.ldap/5/markdown).

### Configuring sudo.conf for sudoers
       **sudo **consults the [_sudo.conf_(5)](https://www.chedong.com/phpMan.php/man/sudo.conf/5/markdown) file to determine which plugins to load.  If  no  [_sudo.conf_(5)](https://www.chedong.com/phpMan.php/man/sudo.conf/5/markdown)
       file is present, or if it contains no _Plugin_ lines, **sudoers **will be used for auditing, policy
       decisions  and  I/O logging.  To explicitly configure [_sudo.conf_(5)](https://www.chedong.com/phpMan.php/man/sudo.conf/5/markdown) to use the **sudoers **plugin,
       the following configuration can be used.

           Plugin sudoers_audit sudoers.so
           Plugin sudoers_policy sudoers.so
           Plugin sudoers_io sudoers.so

       Starting with **sudo **1.8.5, it is possible to specify optional arguments to the **sudoers  **plugin
       in  the  [_sudo.conf_(5)](https://www.chedong.com/phpMan.php/man/sudo.conf/5/markdown) file.  Plugin arguments, if any, should be listed after the path to the
       plugin (i.e., after _sudoers.so_).  The arguments are only effective for the plugin that  opens
       (and parses) the _sudoers_ file.

       For  **sudo **version 1.9.1 and higher, this is the _sudoers_audit_ plugin.  For older versions, it
       is the _sudoers_policy_ plugin.  Multiple arguments may be specified, separated by white space.
       For example:

           Plugin sudoers_audit sudoers.so sudoers_mode=0400 error_recovery=false

       The following plugin arguments are supported:

       error_recovery=bool
             The _error_recovery_ argument can be used to control whether **sudoers  **should  attempt  to
             recover  from syntax errors in the _sudoers_ file.  If set to _true_ (the default), **sudoers**
             will try to recover from a syntax error by discarding the portion of the line that con‐
             tains the error until the end of the line.  A value of _false_ will disable error  recov‐
             ery.  Prior to version 1.9.3, no error recovery was performed.

       ignore_perms=bool
             The  _ignore_perms_  argument  can  be  used  to disable security checks when loading the
             _sudoers_ file.  If enabled, the _sudoers_ file will be loaded regardless of the  owner  or
             file mode.  This argument is intended to be used for testing purposes and should not be
             enabled on production systems.

       ldap_conf=pathname
             The _ldap_conf_ argument can be used to override the default path to the _ldap.conf_ file.

       ldap_secret=pathname
             The  _ldap_secret_  argument  can be used to override the default path to the _ldap.secret_
             file.

       sudoers_file=pathname
             The _sudoers_file_ argument can be used to override the default path to the _sudoers_ file.

       sudoers_uid=user-ID
             The _sudoers_uid_ argument can be used to override the default owner of the sudoers file.
             It should be specified as a numeric user-ID.

       sudoers_gid=group-ID
             The _sudoers_gid_ argument can be used to override the default group of the sudoers file.
             It must be specified as a numeric group-ID (not a group name).

       sudoers_mode=mode
             The _sudoers_mode_ argument can be used to override the default file mode for the sudoers
             file.  It should be specified as an octal value.

       For more information on configuring [_sudo.conf_(5)](https://www.chedong.com/phpMan.php/man/sudo.conf/5/markdown), refer to its manual.

### User Authentication
       The **sudoers **security policy requires that most users authenticate themselves before they  can
       use **sudo**.  A password is not required if the invoking user is **root**, if the target user is the
       same  as the invoking user, or if the policy has disabled authentication for the user or com‐
       mand.  Unlike [_su_(1)](https://www.chedong.com/phpMan.php/man/su/1/markdown), when **sudoers **requires authentication, it validates the  invoking  user's
       credentials,  not  the  target  user's  (or **root**'s) credentials.  This can be changed via the
       _rootpw_, _targetpw_ and _runaspw_ flags, described later.

       If a user who is not listed in the policy tries to run a command via **sudo**, mail  is  sent  to
       the  proper  authorities.   The address used for such mail is configurable via the _mailto_ De‐
       faults entry (described later) and defaults to _root_.

       No mail will be sent if an unauthorized user tries to run **sudo **with the **-l **or **-v  **option  un‐
       less  there  is  an authentication error and either the _mail_always_ or _mail_badpass_ flags are
       enabled.  This allows users to determine for themselves whether or not they  are  allowed  to
       use **sudo**.  By default, all attempts to run **sudo **(successful or not) are logged, regardless of
       whether or not mail is sent.

       If **sudo **is run by **root **and the SUDO_USER environment variable is set, the **sudoers **policy will
       use  this  value to determine who the actual user is.  This can be used by a user to log com‐
       mands through sudo even when a **root **shell has been invoked.  It also allows the **-e **option  to
       remain  useful  even  when invoked via a sudo-run script or program.  Note, however, that the
       _sudoers_ file lookup is still done for **root**, not the user specified by SUDO_USER.

       **sudoers **uses per-user time stamp files for credential caching.  Once a user has been  authen‐
       ticated, a record is written containing the user-ID that was used to authenticate, the termi‐
       nal  session  ID,  the  start time of the session leader (or parent process) and a time stamp
       (using a monotonic clock if one is available).  The user may then use **sudo **without a password
       for a short period of time (15 minutes unless overridden by  the  _timestamp_timeout_  option).
       By default, **sudoers **uses a separate record for each terminal, which means that a user's login
       sessions  are  authenticated separately.  The _timestamp_type_ option can be used to select the
       type of time stamp record **sudoers **will use.

### Logging
       By default, **sudoers **logs both successful and unsuccessful attempts (as well as errors).   The
       _log_allowed_  and  _log_denied_  flags  can  be  used to control this behavior.  Messages can be
       logged to [_syslog_(3)](https://www.chedong.com/phpMan.php/man/syslog/3/markdown), a log file, or both.  The default is to log to  [_syslog_(3)](https://www.chedong.com/phpMan.php/man/syslog/3/markdown)  but  this  is
       configurable  via  the _syslog_ and _logfile_ settings.  See “EVENT LOGGING” for a description of
       the log file format.

       **sudoers **is also capable of running a command in a pseudo-terminal and  logging  input  and/or
       output.   The standard input, standard output, and standard error can be logged even when not
       associated with a terminal.  For more information about I/O logging, see  the  “I/O  LOGGING”
       section.

       Starting with version 1.9, the _log_servers_ setting may be used to send event and I/O log data
       to  a  remote server running **sudo_logsrvd **or another service that implements the protocol de‐
       scribed by [_sudo_logsrv.proto_(5)](https://www.chedong.com/phpMan.php/man/sudologsrv.proto/5/markdown).

### Command environment
       Since environment variables can influence program behavior, **sudoers **provides a means  to  re‐
       strict  which  variables  from the user's environment are inherited by the command to be run.
       There are two distinct ways **sudoers **can deal with environment variables.

       By default, the _env_reset_ flag is enabled.  This causes commands to be executed with  a  new,
       minimal  environment.  On AIX (and Linux systems without PAM), the environment is initialized
       with the contents of the _/etc/environment_ file.  The HOME, MAIL, SHELL, LOGNAME and USER  en‐
       vironment variables are initialized based on the target user and the SUDO_* variables are set
       based  on  the invoking user.  Additional variables, such as DISPLAY, PATH and TERM, are pre‐
       served from the invoking user's environment if permitted by the _env_check_,  or  _env_keep_  op‐
       tions.   A  few  environment variables are treated specially.  If the PATH and TERM variables
       are not preserved from the user's environment, they will  be  set  to  default  values.   The
       LOGNAME  and  USER  are handled as a single entity.  If one of them is preserved (or removed)
       from the user's environment, the other will be as well.  If LOGNAME and USER are to  be  pre‐
       served  but  only  one of them is present in the user's environment, the other will be set to
       the same value.  This avoids an inconsistent environment where one of the variables  describ‐
       ing the user name is set to the invoking user and one is set to the target user.  Environment
       variables  with  a value beginning with ‘()’ are removed unless both the name and value parts
       are matched by _env_keep_ or _env_check_, as they may be interpreted as  functions  by  the  **bash**
       shell.  Prior to version 1.8.11, such variables were always removed.

       If,  however,  the  _env_reset_  flag  is  disabled, any variables not explicitly denied by the
       _env_check_ and _env_delete_ options are allowed and their values are inherited from the invoking
       process.  Prior to version 1.8.21, environment variables with a  value  beginning  with  ‘()’
       were always removed.  Beginning with version 1.8.21, a pattern in _env_delete_ is used to match
       **bash  **shell  functions  instead.  Since it is not possible to block all potentially dangerous
       environment variables, use of the default _env_reset_ behavior is encouraged.

       Environment variables specified by _env_check_, _env_delete_, or _env_keep_ may include one or more
       ‘*’ characters which will match zero or more characters.  No other  wildcard  characters  are
       supported.

       By  default,  environment variables are matched by name.  However, if the pattern includes an
       equal sign (‘=’), both the variables name and value must match.  For example,  a  **bash  **shell
       function could be matched as follows:

           env_keep += "BASH_FUNC_my_func%%=()*"

       Without the ‘=()*’ suffix, this would not match, as **bash **shell functions are not preserved by
       default.

       The  complete  list  of  environment  variables that are preserved or removed, as modified by
       global Defaults parameters in _sudoers_, is displayed when **sudo **is run by **root **with the **-V  **op‐
       tion.   The list of environment variables to remove varies based on the operating system **sudo**
       is running on.

       Other settings may influence the command environment:

       **•  sudoers **options such as _always_set_home_, _secure_path_, _set_logname_, _set_home_, and _setenv_.

       **•  **Command tags, such as SETENV and NOSETENV.  Note that SETENV is  implied  if  the  command
          matched is **ALL**.

       **•  sudo **options, such as **-E **and **-i**.

       On  systems  that  support PAM where the **pam_env **module is enabled for **sudo**, variables in the
       PAM environment may be merged in to the environment.  If a variable in the PAM environment is
       already present in the user's environment, the value will only be overridden if the  variable
       was not preserved by **sudoers**.  When _env_reset_ is enabled, variables preserved from the invok‐
       ing  user's  environment  by the _env_keep_ list take precedence over those in the PAM environ‐
       ment.  When _env_reset_ is disabled, variables present the  invoking  user's  environment  take
       precedence  over  those  in the PAM environment unless they match a pattern in the _env_delete_
       list.

       The dynamic linker on most operating systems will remove variables that can  control  dynamic
       linking  from  the  environment of set-user-ID executables, including **sudo**.  Depending on the
       operating system this may include _RLD*, DYLD_*, LD_*, LDR_*, LIBPATH, SHLIB_PATH,  and  oth‐
       ers.  These type of variables are removed from the environment before **sudo **even begins execu‐
       tion and, as such, it is not possible for **sudo **to preserve them.

       As a special case, if the **-i **option (initial login) is specified, **sudoers **will initialize the
       environment  regardless  of the value of _env_reset_.  The DISPLAY, PATH and TERM variables re‐
       main unchanged; HOME, MAIL, SHELL, USER, and LOGNAME are set based on the  target  user.   On
       AIX (and Linux systems without PAM), the contents of _/etc/environment_ are also included.  All
       other  environment variables are removed unless permitted by _env_keep_ or _env_check_, described
       above.

       Finally, the _restricted_env_file_ and _env_file_ files are applied, if present.   The  variables
       in  _restricted_env_file_ are applied first and are subject to the same restrictions as the in‐
       voking user's environment, as detailed above.  The variables in _env_file_ are applied last and
       are not subject to these restrictions.  In both cases, variables present in  the  files  will
       only be set to their specified values if they would not conflict with an existing environment
       variable.

## SUDOERS FILE FORMAT
       The  _sudoers_ file is composed of two types of entries: aliases (basically variables) and user
       specifications (which specify who may run what).

       When multiple entries match for a user, they are applied in order.  Where there are  multiple
       matches, the last match is used (which is not necessarily the most specific match).

       The  _sudoers_ file grammar will be described below in Extended Backus-Naur Form (EBNF).  Don't
       despair if you are unfamiliar with EBNF; it is fairly simple, and the definitions  below  are
       annotated.

### Resource limits
       By  default, **sudoers **uses the operating system's native method of setting resource limits for
       the target user.  On Linux systems, resource limits are usually set by the _pam_limits.so_  PAM
       module.   On  some  BSD  systems,  the _/etc/login.conf_ file specifies resource limits for the
       user.  On AIX systems, resource limits are configured in the _/etc/security/limits_  file.   If
       there  is  no system mechanism to set per-user resource limits, the command will run with the
       same limits as the invoking user.  The one exception to this is  the  core  dump  file  size,
       which  is  set by **sudoers **to 0 by default.  Disabling core dumps by default makes it possible
       to avoid potential security problems where the core file is treated as trusted input.

       Resource limits may also be set in the _sudoers_ file itself, in which case they override those
       set by the system.  See the _rlimit_as,_ _rlimit_core,_  _rlimit_cpu,_  _rlimit_data,_  _rlimit_fsize,_
       _rlimit_locks,_  _rlimit_memlock,_  _rlimit_nofile,_ _rlimit_nproc,_ _rlimit_rss,_ _rlimit_stack_ options
       described below.  Resource limits in **sudoers **may be specified in one of  the  following  for‐
       mats:

       “value”
               Both  the soft and hard resource limits are set to the same value.  The special value
               “infinity” can be used to indicate that the value is unlimited.

       “soft,hard”
               Two comma-separated values.  The soft limit is set to the first value  and  the  hard
               limit  is  set to the second.  Both values must either be enclosed in a set of double
               quotes, or the comma must be escaped with  a  backslash  (‘\’).   The  special  value
               “infinity” may be used in place of either value.

       “default”
               The  default  resource  limit for the user will be used.  This may be a user-specific
               value (see above) or the value of the resource limit when **sudo **was invoked  for  sys‐
               tems that don't support per-user limits.

       “user”  The invoking user's resource limits will be preserved when running the command.

       For  example, to restore the historic core dump file size behavior, a line like the following
       may be used.

             **Defaults rlimit_core=default**

       Resource limits in **sudoers **are only supported by version 1.8.7 or higher.

### Quick guide to EBNF
       EBNF is a concise and exact way of describing the grammar of a language.  Each  EBNF  defini‐
       tion is made up of _production_ _rules_.  For example:

           symbol ::= definition | alternate1 | alternate2 ...

       Each  _production_  _rule_  references others and thus makes up a grammar for the language.  EBNF
       also contains the following operators, which many readers will recognize from regular expres‐
       sions.  Do not, however, confuse them with “wildcard” characters, which have different  mean‐
       ings.

       ?     Means that the preceding symbol (or group of symbols) is optional.  That is, it may ap‐
             pear once or not at all.

       *     Means that the preceding symbol (or group of symbols) may appear zero or more times.

       +     Means that the preceding symbol (or group of symbols) may appear one or more times.

       Parentheses  may  be  used to group symbols together.  For clarity, we will use single quotes
       ('') to designate what is a verbatim character string (as opposed to a symbol name).

### Aliases
       There are four kinds of aliases: _User_Alias_, _Runas_Alias_, _Host_Alias_ and _Cmnd_Alias_.   Begin‐
       ning with **sudo **1.9.0, _Cmd_Alias_ may be used in place of _Cmnd_Alias_ if desired.

       Alias ::= 'User_Alias'  User_Alias_Spec (':' User_Alias_Spec)* |
                 'Runas_Alias' Runas_Alias_Spec (':' Runas_Alias_Spec)* |
                 'Host_Alias'  Host_Alias_Spec (':' Host_Alias_Spec)* |
                 'Cmnd_Alias'  Cmnd_Alias_Spec (':' Cmnd_Alias_Spec)* |
                 'Cmd_Alias'   Cmnd_Alias_Spec (':' Cmnd_Alias_Spec)*

       User_Alias ::= NAME

       User_Alias_Spec ::= User_Alias '=' User_List

       Runas_Alias ::= NAME

       Runas_Alias_Spec ::= Runas_Alias '=' Runas_List

       Host_Alias ::= NAME

       Host_Alias_Spec ::= Host_Alias '=' Host_List

       Cmnd_Alias ::= NAME

       Cmnd_Alias_Spec ::= Cmnd_Alias '=' Cmnd_List

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

       Each _alias_ definition is of the form

       Alias_Type NAME = item1, item2, ...

       where  _Alias_Type_  is one of _User_Alias_, _Runas_Alias_, _Host_Alias_, or _Cmnd_Alias_.  A NAME is a
       string of uppercase letters, numbers, and underscore characters (‘_’).   A  NAME  **must  **start
       with  an  uppercase letter.  It is possible to put several alias definitions of the same type
       on a single line, joined by a colon (‘:’).  For example:

       Alias_Type NAME = item1, item2, item3 : NAME = item4, item5

       It is a syntax error to redefine an existing _alias_.  It is possible to use the same name  for
       _aliases_ of different types, but this is not recommended.

       The definitions of what constitutes a valid _alias_ member follow.

       User_List ::= User |
                     User ',' User_List

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

       A  _User_List_ is made up of one or more user names, user-IDs (prefixed with ‘#’), system group
       names and IDs (prefixed with ‘%’ and ‘%#’ respectively), netgroups (prefixed with ‘+’),  non-
       Unix  group names and IDs (prefixed with ‘%:’ and ‘%:#’ respectively), and _User_Alias_es. Each
       list item may be prefixed with zero or more ‘!’ operators.  An odd number  of  ‘!’  operators
       negate  the value of the item; an even number just cancel each other out.  User netgroups are
       matched using the user and domain members only; the host member is not used when matching.

       A _user_ _name_, _user-ID_, _group_, _group-ID_, _netgroup_, _nonunix_group_ or _nonunix_gid_ may be enclosed
       in double quotes to avoid the need for escaping  special  characters.   Alternately,  special
       characters  may  be  specified  in escaped hex mode, e.g., \x20 for space.  When using double
       quotes, any prefix characters must be included inside the quotes.

       The actual _nonunix_group_ and _nonunix_gid_ syntax depends on the underlying group provider plu‐
       gin.  For instance, the QAS AD plugin supports the following formats:

       **•  **Group in the same domain: "%:Group Name"

       **•  **Group in any domain: "%:Group <Name@FULLY.QUALIFIED.DOMAIN>"

       **•  **Group SID: "%:S-1-2-34-5678901234-5678901234-5678901234-567"

       See “GROUP PROVIDER PLUGINS” for more information.

       Quotes around group names are optional.  Unquoted strings must use a backslash (‘\’)  to  es‐
       cape  spaces and special characters.  See “Other special characters and reserved words” for a
       list of characters that need to be escaped.

       Runas_List ::= Runas_Member |
                      Runas_Member ',' Runas_List

       Runas_Member ::= '!'* user name |
                        '!'* #user-ID |
                        '!'* %group |
                        '!'* %#group-ID |
                        '!'* %:nonunix_group |
                        '!'* %:#nonunix_gid |
                        '!'* +netgroup |
                        '!'* Runas_Alias |
                        '!'* ALL

       A _Runas_List_ is similar to a _User_List_ except that instead of  _User_Alias_es  it  can  contain
       _Runas_Alias_es.   User  names  and  groups  are matched as strings.  In other words, two users
       (groups) with the same user (group) ID are considered to be distinct.  If you wish  to  match
       all  user names with the same user-ID (e.g., **root **and **toor**), you can use a user-ID instead of
       a name (#0 in the example given).  The user-ID or group-ID specified in a  _Runas_Member_  need
       not be listed in the password or group database.

       Host_List ::= Host |
                     Host ',' Host_List

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

       A  _Host_List_  is  made up of one or more host names, IP addresses, network numbers, netgroups
       (prefixed with ‘+’), and other aliases.  Again, the value of an item may be negated with  the
       ‘!’ operator.  Host netgroups are matched using the host (both qualified and unqualified) and
       domain  members  only;  the  user member is not used when matching.  If you specify a network
       number without a netmask, **sudo **will query each of the local host's network interfaces and, if
       the network number corresponds to one of the hosts's network interfaces, will use the netmask
       of that interface.  The netmask may be specified  either  in  standard  IP  address  notation
       (e.g., 255.255.255.0 or ffff:ffff:ffff:ffff::), or CIDR notation (number of bits, e.g., 24 or
       64).   A host name may include shell-style wildcards (see the “Wildcards” section below), but
       unless the _hostname_ command on your machine returns the fully  qualified  host  name,  you'll
       need  to use the _fqdn_ flag for wildcards to be useful.  **sudo **only inspects actual network in‐
       terfaces; this means that IP address 127.0.0.1 (localhost) will never match.  Also, the  host
       name  “localhost”  will only match if that is the actual host name, which is usually only the
       case for non-networked systems.

       digest ::= [A-Fa-f0-9]+ |
                  [A-Za-z0-9\+/=]+

       Digest_Spec ::= "sha224" ':' digest |
                       "sha256" ':' digest |
                       "sha384" ':' digest |
                       "sha512" ':' digest

       Digest_List ::= Digest_Spec |
                       Digest_Spec ',' Digest_List

       Cmnd_List ::= Cmnd |
                     Cmnd ',' Cmnd_List

       command name ::= regex |
                        file name

       command ::= command name |
                   command name args |
                   command name regex |
                   command name '""' |
                   ALL

       Edit_Spec ::= "sudoedit" file name+ |
                     "sudoedit" regex |
                     "sudoedit"

       List_Spec ::= "list"

       Cmnd ::= Digest_List? '!'* command |
                '!'* directory |
                '!'* Edit_Spec |
                '!'* List_Spec |
                '!'* Cmnd_Alias

       A _Cmnd_List_ is a list of one or more commands, directories, or aliases.  A command is a fully
       qualified file name, which may include shell-style wildcards (see the “Wildcards” section be‐
       low), or a regular expression that starts with ‘^’  and  ends  with  ‘$’  (see  the  “Regular
       expressions”  section  below).   A  directory is a fully qualified path name ending in a ‘/’.
       When you specify a directory in a _Cmnd_List_, the user will be able to  run  any  file  within
       that  directory  (but  not in any sub-directories therein).  If no command line arguments are
       specified, the user may run the command with any arguments they choose.  Command  line  argu‐
       ments  can  include  wildcards  or be a regular expression that starts with ‘^’ and ends with
       ‘$’.  If the command line arguments consist of ‘""’, the command may only be run with _no_  ar‐
       guments.

       If  a  _Cmnd_ has associated command line arguments, the arguments in the _Cmnd_ must match those
       given by the user on the command line.  If the arguments in a _Cmnd_ begin with the ‘^’ charac‐
       ter, they will be interpreted as a regular expression and  matched  accordingly.   Otherwise,
       shell-style  wildcards are used when matching.  Unless a regular expression is specified, the
       following characters must be escaped with a ‘\’ if they are used in command  arguments:  ‘,’,
       ‘:’, ‘=’, ‘\’.  To prevent arguments in a _Cmnd_ that begin with a ‘^’ character from being in‐
       terpreted as a regular expression, the ‘^’ must be escaped with a ‘\’.

       There are two commands built into **sudo **itself: “list” and “sudoedit”.  Unlike other commands,
       these two must be specified in the _sudoers_ file _without_ a leading path.

       The  “list”  built-in  can  be  used  to permit a user to list another user's privileges with
       **sudo**'s **-U **option.  For example, “sudo -l -U otheruser”.  A user with the “list” privilege  is
       able  to list another user's privileges even if they don't have permission to run commands as
       that user.  By default, only root or a user with the ability to run  any  command  as  either
       root  or the specified _user_ on the current host may use the **-U **option.  No command line argu‐
       ments may be specified with the “list” built-in.

       The “sudoedit” built-in is used to permit a user to run  **sudo  **with  the  **-e  **option  (or  as
       **sudoedit**).   It  may take command line arguments just as a normal command does.  Unlike other
       commands, “sudoedit” is built into **sudo **itself and must be  specified  in  the  _sudoers_  file
       _without_  a  leading  path.   If a leading path is present, for example _/usr/bin/sudoedit_, the
       path name will be silently converted to “sudoedit”.  A fully-qualified path for  **sudoedit  **is
       treated as an error by **visudo**.

       A _command_ may be preceded by a _Digest_List_, a comma-separated list of one or more _Digest_Spec_
       entries.   If a _Digest_List_ is present, the command will only match successfully if it can be
       verified using one of the SHA-2 digests in the list.  Starting with version  1.9.0,  the  **ALL**
       reserved  word  can  be used in conjunction with a _Digest_List_.  The following digest formats
       are supported: sha224, sha256, sha384, and sha512.  The string may be specified in either hex
       or base64 format (base64 is more compact).  There are several utilities capable of generating
       SHA-2 digests in hex  format  such  as  openssl,  shasum,  sha224sum,  sha256sum,  sha384sum,
       sha512sum.

       For example, using openssl:

       $ openssl dgst -sha224 /bin/ls
       SHA224(/bin/ls)= 118187da8364d490b4a7debbf483004e8f3e053ec954309de2c41a25

       It is also possible to use openssl to generate base64 output:

       $ openssl dgst -binary -sha224 /bin/ls | openssl base64
       EYGH2oNk1JC0p9679IMATo8+BT7JVDCd4sQaJQ==

       Warning, if the user has write access to the command itself (directly or via a **sudo **command),
       it  may  be possible for the user to replace the command after the digest check has been per‐
       formed but before the command is executed.  A similar race condition exists on  systems  that
       lack  the  [_fexecve_(2)](https://www.chedong.com/phpMan.php/man/fexecve/2/markdown)  system  call  when  the  directory  in which the command is located is
       writable by the user.  See the description of the _fdexec_ setting for more information on  how
       **sudo **executes commands that have an associated digest.

       Command digests are only supported by version 1.8.7 or higher.

### Defaults
       Certain configuration options may be changed from their default values at run-time via one or
       more  _Default_Entry_ lines.  These may affect all users on any host (‘Defaults’), all users on
       a specific host (‘Defaults@host’), a specific  user  (‘Defaults:user’),  a  specific  command
       (‘Defaults!cmnd’), or commands being run as a specific user (‘Defaults>runasuser’).

       White  space  is  not  permitted between ‘Defaults’ and the ‘@’, ‘:’, ‘!’, or ‘>’ characters.
       While a comma-separated list may be used in place of a single value after the ‘@’, ‘:’,  ‘!’,
       or ‘>’ character, using an alias instead of a list is often improve readability.  Per-command
       entries  may  not include command line arguments.  If you need to specify arguments, define a
       _Cmnd_Alias_ and reference that instead.

       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

       Parameters may be **flags**, **integer **values, **strings**, or **lists**.  Flags are implicitly boolean and
       can be turned off via the ‘!’ operator.  Some integer, string and list parameters may also be
       used in a boolean context to disable them.  Values may be enclosed in double quotes ("") when
       they contain multiple words.  Special characters may be escaped with a backslash (‘\’).

       To include a literal backslash character in a command line argument you must escape the back‐
       slash twice.  For example, to match ‘\n’ as part of a command line  argument,  you  must  use
       ‘\\\\n’  in  the _sudoers_ file.  This is due to there being two levels of escaping, one in the
       _sudoers_ parser itself and another when command line arguments are matched by  the  [_fnmatch_(3)](https://www.chedong.com/phpMan.php/man/fnmatch/3/markdown)
       or [_regexec_(3)](https://www.chedong.com/phpMan.php/man/regexec/3/markdown) function.

       Lists  have  two additional assignment operators, ‘+=’ and ‘-=’.  These operators are used to
       add to and delete from a list respectively.  It is not an error to use the ‘-=’  operator  to
       remove an element that does not exist in a list.

       Defaults  entries  are  parsed in the following order: global, host, user, and runas Defaults
       first, then command defaults.  If there are multiple Defaults settings of the same type,  the
       last  matching setting is used.  The following Defaults settings are parsed before all others
       since they may affect subsequent entries: _fqdn_, _group_plugin_, _runas_default_, _sudoers_locale_.

       See “SUDOERS OPTIONS” for a list of supported Defaults parameters.

### User specification
       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? Option_Spec* (Tag_Spec ':')* Cmnd

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

       Option_Spec ::= (SELinux_Spec | Date_Spec | Timeout_Spec | Chdir_Spec | Chroot_Spec)

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

       AppArmor_Spec ::= 'APPARMOR_PROFILE=profile'

       Date_Spec ::= ('NOTBEFORE=timestamp' | 'NOTAFTER=timestamp')

       Timeout_Spec ::= 'TIMEOUT=timeout'

       Chdir_Spec ::= 'CWD=directory'

       Chroot_Spec ::= 'CHROOT=directory'

       Tag_Spec ::= ('EXEC' | 'NOEXEC' | 'FOLLOW' | 'NOFOLLOW' |
                     'LOG_INPUT' | 'NOLOG_INPUT' | 'LOG_OUTPUT' |
                     'NOLOG_OUTPUT' | 'MAIL' | 'NOMAIL' | 'INTERCEPT' |
                     'NOINTERCEPT' | 'PASSWD' | 'NOPASSWD' | 'SETENV' |
                     'NOSETENV')

       A **user specification **determines which commands a user may run (and as what user) on specified
       hosts.  By default, commands are run as **root **(unless _runas_default_ has been set to a  differ‐
       ent value) but this can also be changed on a per-command basis.

       The  basic  structure  of  a user specification is “who where = (as_whom) what”.  Let's break
       that down into its constituent parts:

### Runas_Spec
       A _Runas_Spec_ determines the user and/or the group that a command may be  run  as.   A  fully-
       specified  _Runas_Spec_  consists  of  two  _Runas_List_s (as defined above) separated by a colon
       (‘:’) and enclosed in a set of parentheses.  The first _Runas_List_ indicates which  users  the
       command  may  be  run  as via the **-u **option.  The second defines a list of groups that may be
       specified via the **-g **option (in addition to any  of  the  target  user's  groups).   If  both
       _Runas_List_s  are  specified,  the command may be run with any combination of users and groups
       listed in their respective _Runas_List_s. If only the first is specified, the  command  may  be
       run  as  any user in the list and, optionally, with any group the target user belongs to.  If
       the first _Runas_List_ is empty but the second is specified, the command may be run as the  in‐
       voking  user  with  the  group  set to any listed in the _Runas_List_.  If both _Runas_List_s are
       empty, the command may only be run as the invoking user and the group, if specified, must  be
       one  that  the  invoking user is a member of.  If no _Runas_Spec_ is specified, the command may
       only be run as the _runas_default_ user (**root **by default) and the group, if specified, must  be
       one that the _runas_default_ user is a member of.

       A  _Runas_Spec_  sets the default for the commands that follow it.  What this means is that for
       the entry:

       dgb     boulder = (operator) /bin/ls, /bin/kill, /usr/bin/lprm

       The user **dgb **may run _/bin/ls_, _/bin/kill_, and _/usr/bin/lprm_ on the host  boulder—but  only  as
       **operator**.  For example:

       $ sudo -u operator /bin/ls

       It  is  also  possible to override a _Runas_Spec_ later on in an entry.  If we modify the entry
       like so:

       dgb     boulder = (operator) /bin/ls, (root) /bin/kill, /usr/bin/lprm

       Then user **dgb **is now allowed to run _/bin/ls_ as **operator**, but _/bin/kill_ and  _/usr/bin/lprm_  as
       **root**.

       We can extend this to allow **dgb **to run _/bin/ls_ with either the user or group set to **operator**:

       dgb     boulder = (operator : operator) /bin/ls, (root) /bin/kill,\
               /usr/bin/lprm

       While the group portion of the _Runas_Spec_ permits the user to run as command with that group,
       it  does not force the user to do so.  If no group is specified on the command line, the com‐
       mand will run with the group listed in the target user's password database entry.   The  fol‐
       lowing would all be permitted by the sudoers entry above:

       $ sudo -u operator /bin/ls
       $ sudo -u operator -g operator /bin/ls
       $ sudo -g operator /bin/ls

       In  the following example, user **tcm **may run commands that access a modem device file with the
       dialer group.

       tcm     boulder = (:dialer) /usr/bin/tip, /usr/bin/cu,\
               /usr/local/bin/minicom

       In this example only the group will be set, the command still runs as user **tcm**.  For example:

       $ sudo -g dialer /usr/bin/cu

       Multiple users and groups may be present in a _Runas_Spec_, in which case the user  may  select
       any combination of users and groups via the **-u **and **-g **options.  In this example:

       alan    ALL = (root, bin : operator, system) ALL

       user **alan **may run any command as either user **root **or **bin**, optionally setting the group to op‐
       erator or system.

### Option_Spec
       A  _Cmnd_  may  have  zero  or more options associated with it.  Options may consist of SELinux
       roles and/or types, AppArmor profiles, start and/or end dates and command timeouts.  Once  an
       option  is set for a _Cmnd_, subsequent _Cmnd_s in the _Cmnd_Spec_List_, inherit that option unless
       it is overridden by another option.  Option names are reserved words in _sudoers_.  This  means
       that none of the valid option names (see below) can be used when declaring an alias.

### SELinux_Spec
       On  systems  with  SELinux  support, _sudoers_ file entries may optionally have an SELinux role
       and/or type associated with a command.  This can be used to implement a  form  of  role-based
       access  control (RBAC).  If a role or type is specified with the command it will override any
       default values specified in _sudoers_.  A role or type specified on the command line,  however,
       will supersede the values in _sudoers_.

### AppArmor_Spec
       On  systems supporting AppArmor, _sudoers_ file entries may optionally specify an AppArmor pro‐
       file that should be used to confine a command.  If an AppArmor profile is specified with  the
       command, it will override any default values specified in _sudoers_.  Appropriate profile tran‐
       sition rules must be defined to support the profile change specified for a user.

       AppArmor   profiles   can   be  specified  in  any  way  that  complies  with  the  rules  of
       [_aa_change_profile_(2)](https://www.chedong.com/phpMan.php/man/aachangeprofile/2/markdown).  For instance, in the following _sudoers_ entry

       alice   ALL = (root)    APPARMOR_PROFILE=my-profile     ALL

       the user **alice **may run any command as **root **under confinement  by  the  profile  ‘my-profile’.
       You  can also stack profiles, or allow a user to run commands unconfined by any profile.  For
       example:

       bob     ALL = (root)    APPARMOR_PROFILE=foo//&bar      /usr/bin/vi
       cathy   ALL = (root)    APPARMOR_PROFILE=unconfined     /bin/ls

       These _sudoers_ entries allow user **bob **to run _/usr/bin/vi_ as **root **under  the  stacked  profiles
       ‘foo’ and ‘bar’, and user **cathy **to run _/bin/ls_ without any confinement at all.

### Date_Spec
       **sudoers  **rules can be specified with a start and end date via the NOTBEFORE and NOTAFTER set‐
       tings.  The time stamp must be specified in “Generalized Time” as defined by RFC  4517.   The
       format  is effectively ‘yyyymmddHHMMSSZ’ where the minutes and seconds are optional.  The ‘Z’
       suffix indicates that the time stamp is in Coordinated Universal Time (UTC).  It is also pos‐
       sible to specify a timezone offset from UTC in hours and minutes instead of a ‘Z’.  For exam‐
       ple, ‘-0500’ would correspond to Eastern Standard time in the US.  As an extension, if no ‘Z’
       or timezone offset is specified, local time will be used.

       The following are all valid time stamps:

           20170214083000Z
           2017021408Z
           20160315220000-0500
           20151201235900

### Timeout_Spec
       A command may have a timeout associated with it.  If the timeout expires before  the  command
       has  exited, the command will be terminated.  The timeout may be specified in combinations of
       days, hours, minutes, and seconds with a single-letter case-insensitive suffix that indicates
       the unit of time.  For example, a timeout of 7 days, 8 hours,  30  minutes,  and  10  seconds
       would  be  written as ‘7d8h30m10s’.  If a number is specified without a unit, seconds are as‐
       sumed.  Any of the days, minutes, hours, or seconds may be omitted.  The order must  be  from
       largest to smallest unit and a unit may not be specified more than once.

       The  following  are  all  _valid_ timeout values: ‘7d8h30m10s’, ‘14d’, ‘8h30m’, ‘600s’, ‘3600’.
       The following are _invalid_ timeout values: ‘12m2w1d’, ‘30s10m4h’, ‘1d2d3h’.

       This setting is only supported by version 1.8.20 or higher.

### Chdir_Spec
       The working directory that the command will be run in can be specified using the CWD setting.
       The _directory_ must be a fully-qualified path name beginning with a ‘/’ or ‘~’  character,  or
       the special value “*”.  A value of “*” indicates that the user may specify the working direc‐
       tory  by  running  **sudo  **with  the **-D **option.  By default, commands are run from the invoking
       user's current working directory, unless the **-i **option is given.   Path  names  of  the  form
       _~user/path/name_ are interpreted as being relative to the named user's home directory.  If the
       user name is omitted, the path will be relative to the runas user's home directory.

       This setting is only supported by version 1.9.3 or higher.

### Chroot_Spec
       The root directory that the command will be run in can be specified using the CHROOT setting.
       The  _directory_  must be a fully-qualified path name beginning with a ‘/’ or ‘~’ character, or
       the special value “*”.  A value of “*” indicates that the user may specify the root directory
       by running **sudo **with the **-R **option.  This setting can  be  used  to  run  the  command  in  a
       [_chroot_(2)](https://www.chedong.com/phpMan.php/man/chroot/2/markdown) “sandbox” similar to the [_chroot_(8)](https://www.chedong.com/phpMan.php/man/chroot/8/markdown) utility.  Path names of the form _~user/path/name_
       are  interpreted  as  being relative to the named user's home directory.  If the user name is
       omitted, the path will be relative to the runas user's home directory.

       This setting is only supported by version 1.9.3 or higher.

### Tag_Spec
       A command may have zero or more tags associated with it.  The following tag values  are  sup‐
       ported:  EXEC,  NOEXEC,  FOLLOW,  NOFOLLOW, LOG_INPUT, NOLOG_INPUT, LOG_OUTPUT, NOLOG_OUTPUT,
       MAIL, NOMAIL, INTERCEPT, NOINTERCEPT, PASSWD, NOPASSWD, SETENV, and NOSETENV.  Once a tag  is
       set  on a _Cmnd_, subsequent _Cmnd_s in the _Cmnd_Spec_List_, inherit the tag unless it is overrid‐
       den by the opposite tag (in other words,  PASSWD  overrides  NOPASSWD  and  NOEXEC  overrides
       EXEC).

       EXEC and NOEXEC

         If  **sudo **has been compiled with _noexec_ support and the underlying operating system supports
         it, the NOEXEC tag can be used to prevent a dynamically-linked executable from running fur‐
         ther commands itself.

         In the following example, user **aaron **may run _/usr/bin/more_  and  _/usr/bin/vi_  on  the  host
         shanty, but shell escapes will be disabled.

         aaron   shanty = NOEXEC: /usr/bin/more, /usr/bin/vi

         See  the  “Preventing shell escapes” section below for more details on how NOEXEC works and
         whether or not it will work on your system.

       FOLLOW and NOFOLLOW

         Starting with version 1.8.15, **sudoedit **will not open a file that is a symbolic link  unless
         the  _sudoedit_follow_  flag  is enabled.  The FOLLOW and NOFOLLOW tags override the value of
         _sudoedit_follow_ and can be used to permit (or deny) the editing of symbolic links on a per-
         command basis.  These tags are only effective for the _sudoedit_ command and are ignored  for
         all other commands.

       LOG_INPUT and NOLOG_INPUT

         These  tags  override the value of the _log_input_ flag on a per-command basis.  For more in‐
         formation, see “I/O LOGGING”.

       LOG_OUTPUT and NOLOG_OUTPUT

         These tags override the value of the _log_output_ flag on a per-command basis.  For more  in‐
         formation, see “I/O LOGGING”.

       MAIL and NOMAIL

         These  tags  provide fine-grained control over whether mail will be sent when a user runs a
         command by overriding the value of the _mail_all_cmnds_ flag on a  per-command  basis.   They
         have no effect when **sudo **is run with the **-l **or **-v **options.  A NOMAIL tag will also override
         the  _mail_always_  and _mail_no_perms_ options.  For more information, see the descriptions of
         _mail_all_cmnds_, _mail_always_, and _mail_no_perms_ in the “SUDOERS OPTIONS” section below.

       PASSWD and NOPASSWD

         By default, **sudo **requires that a user authenticate before running a command.  This behavior
         can be modified via the NOPASSWD tag.  Like a _Runas_Spec_, the NOPASSWD tag sets  a  default
         for  the  commands that follow it in the _Cmnd_Spec_List_.  Conversely, the PASSWD tag can be
         used to reverse things.  For example:

         ray     rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm

         would allow the user **ray **to run _/bin/kill_, _/bin/ls_, and _/usr/bin/lprm_ as **root  **on  the  ma‐
         chine  “rushmore”  without  authenticating  himself.  If we only want **ray **to be able to run
         _/bin/kill_ without a password the entry would be:

         ray     rushmore = NOPASSWD: /bin/kill, PASSWD: /bin/ls, /usr/bin/lprm

         Note, however, that the PASSWD tag has no effect on users who are in the group specified by
         the _exempt_group_ setting.

         By default, if the NOPASSWD tag is applied to any of a user's entries for the current host,
         the user will be able to run ‘sudo -l’ without a password.  Additionally, a user  may  only
         run ‘sudo -v’ without a password if all of the user's entries for the current host have the
         NOPASSWD tag.  This behavior may be overridden via the _verifypw_ and _listpw_ options.

       SETENV and NOSETENV

         These  tags  override  the  value of the _setenv_ flag on a per-command basis.  If SETENV has
         been set for a command, the user may disable the _env_reset_ flag from the command  line  via
         the **-E **option.  Additionally, environment variables set on the command line are not subject
         to  the  restrictions imposed by _env_check_, _env_delete_, or _env_keep_.  As such, only trusted
         users should be allowed to set variables in this manner.  If the command  matched  is  **ALL**,
         the  SETENV  tag  is implied for that command; this default may be overridden by use of the
         NOSETENV tag.

       INTERCEPT and NOINTERCEPT

         If **sudo **has been compiled with _intercept_ support and the underlying operating  system  sup‐
         ports  it, the INTERCEPT tag can be used to cause programs spawned by a command to be vali‐
         dated against _sudoers_ and logged just like they would be  if  run  through  **sudo  **directly.
         This  is  useful  in  conjunction  with  commands that allow shell escapes such as editors,
         shells, and paginators.  There is additional overhead due to the policy check that may  add
         latency when running commands such as shell scripts that execute a large number of sub-com‐
         mands.   For  interactive  commands, such as a shell or editor, the overhead is not usually
         noticeable.

         In the following example, user **chuck **may run any command on the machine “research”  in  in‐
         tercept mode.

         chuck   research = INTERCEPT: ALL

         See  the  “Preventing  shell escapes” section below for more details on how INTERCEPT works
         and whether or not it will work on your system.

### Wildcards
       **sudo **allows shell-style _wildcards_ (aka meta or glob characters) to be  used  in  host  names,
       path  names,  and  command line arguments in the _sudoers_ file.  Wildcard matching is done via
       the [_glob_(3)](https://www.chedong.com/phpMan.php/man/glob/3/markdown) and [_fnmatch_(3)](https://www.chedong.com/phpMan.php/man/fnmatch/3/markdown) functions as specified by IEEE Std 1003.1 (“POSIX.1”).

       *       Matches any set of zero or more characters (including white space).

       ?       Matches any single character (including white space).

       [...]   Matches any character in the specified range.

       [!...]  Matches any character _not_ in the specified range.

       \x      For any character ‘x’, evaluates to ‘x’.  This is used to escape  special  characters
               such as: ‘*’, ‘?’, ‘[’, and ‘]’.

       **These  are not regular expressions.  **Unlike a regular expression there is no way to match one
       or more characters within a range.

       Character classes may be used if your system's [_glob_(3)](https://www.chedong.com/phpMan.php/man/glob/3/markdown) and [_fnmatch_(3)](https://www.chedong.com/phpMan.php/man/fnmatch/3/markdown) functions support them.
       However, because the ‘:’ character has special meaning in _sudoers_, it must be  escaped.   For
       example:

           /bin/ls [[\:alpha\:]]*

       Would match any file name beginning with a letter.

       A  forward  slash (‘/’) will _not_ be matched by wildcards used in the file name portion of the
       command.  This is to make a path like:

           /usr/bin/*

       match _/usr/bin/who_ but not _/usr/bin/X11/xterm_.

       When matching the command line arguments, however, a slash  _does_  get  matched  by  wildcards
       since command line arguments may contain arbitrary strings and not just path names.

### Wildcards in command line arguments should be used with care.
       Wildcards  can match any character, including white space.  In most cases, it is safer to use
       a regular expression to match command line arguments.  For more information,  see  “Wildcards
       in command arguments” below.

### Exceptions to wildcard rules
       The following exceptions apply to the above rules:

       ""        If  the empty string ‘""’ is the only command line argument in the _sudoers_ file en‐
                 try it means that command is not allowed to be run with _any_ arguments.

       sudoedit  Command line arguments to the _sudoedit_  built-in  command  should  always  be  path
                 names, so a forward slash (‘/’) will not be matched by a wildcard.

### Regular expressions
       Starting  with  version  1.9.10, it is possible to use regular expressions for path names and
       command line arguments.  Regular expressions are more expressive than  shell-style  _wildcards_
       and  are  usually  safer because they provide a greater degree of control when matching.  The
       type of regular expressions supported by **sudoers **are POSIX extended regular expressions, sim‐
       ilar to those used by the [_egrep_(1)](https://www.chedong.com/phpMan.php/man/egrep/1/markdown) utility.  They are usually documented in the  [_regex_(7)](https://www.chedong.com/phpMan.php/man/regex/7/markdown)  or
       [_re_format_(7)](https://www.chedong.com/phpMan.php/man/reformat/7/markdown) manual, depending on the system.  As an extension, if the regular expression be‐
       gins with “(?i)”, it will be matched in a case-insensitive manner.

       In  _sudoers_,  regular  expressions  must start with a ‘^’ character and end with a ‘$’.  This
       makes it explicit what is, or is not, a regular expression.  Either the path name,  the  com‐
       mand  line arguments or both may be regular expressions.  Because the path name and arguments
       are matched separately, it is even possible to use wildcards for the path  name  and  regular
       expressions  for  the  arguments.   It  is not possible to use a single regular expression to
       match both the command and its arguments.  Regular expressions in _sudoers_ are limited to 1024
       characters.

       There is no need to escape _sudoers_ special characters in a regular expression other than  the
       pound sign (‘#’).

       In  the following example, user **john **can run the [_passwd_(1)](https://www.chedong.com/phpMan.php/man/passwd/1/markdown) command as **root **on any host but is
       not allowed to change **root**'s password.  This kind of rule is impossible to express safely us‐
       ing wildcards.

           john    ALL = /usr/bin/passwd ^[a-zA-Z0-9_]+$,\
                         !/usr/bin/passwd root

       It is also possible to use a regular expression in conjunction with **sudoedit **rules.  The fol‐
       lowing rule would give user bob the ability to edit the _/etc/motd_, _/etc/issue_, and _/etc/hosts_
       files only.

           bob    ALL = sudoedit ^/etc/(motd|issue|hosts)$

       Regular expressions may also be used to match the command itself.  In this example, a regular
       expression is used to allow user  **sid  **to  run  the  _/usr/sbin/groupadd_,  _/usr/sbin/groupmod_,
       _/usr/sbin/groupdel_,  _/usr/sbin/useradd_,  _/usr/sbin/usermod_, and _/usr/sbin/userdel_ commands as
       **root**.

           sid    ALL = ^/usr/sbin/(group|user)(add|mod|del)$

       One disadvantage of using a regular expression to match the command name is that  it  is  not
       possible to match relative paths such as _./useradd_ or _../sbin/useradd_.  This has security im‐
       plications  when  a  regular  expression is used for the command name in conjunction with the
       negation operator, ‘!’, as such rules can be trivially bypassed.  Because of  this,  using  a
       negated regular expression for the command name is **strongly discouraged**.  This does not apply
       to  negated  commands that only use a regular expression to match the command arguments.  See
       “Regular expressions in command names” below for more information.

### Including other files from within sudoers
       It is possible to include other _sudoers_ files from within the _sudoers_  file  currently  being
       parsed  using  the _@include_ and _@includedir_ directives.  For compatibility with sudo versions
       prior to 1.9.1, _#include_ and _#includedir_ are also accepted.

       An include file can be used, for example, to keep a site-wide _sudoers_ file in addition  to  a
       local,  per-machine  file.   For  the sake of this example the site-wide _sudoers_ file will be
       _/etc/sudoers_  and   the   per-machine   one   will   be   _/etc/sudoers.local_.    To   include
       _/etc/sudoers.local_ from within _/etc/sudoers_ one would use the following line in _/etc/sudoers_:

           @include /etc/sudoers.local

       When **sudo **reaches this line it will suspend processing of the current file (_/etc/sudoers_) and
       switch  to  _/etc/sudoers.local_.   Upon  reaching  the  end of _/etc/sudoers.local_, the rest of
       _/etc/sudoers_ will be processed.  Files that are included may themselves include other  files.
       A hard limit of 128 nested include files is enforced to prevent include file loops.

       Starting  with  version  1.9.1, the path to the include file may contain white space if it is
       escaped with a backslash (‘\’).  Alternately, the entire  path  may  be  enclosed  in  double
       quotes  (""),  in which case no escaping is necessary.  To include a literal backslash in the
       path, ‘\\’ should be used.

       If the path to the include file is not fully-qualified (does not begin with a ‘/’),  it  must
       be  located  in the same directory as the sudoers file it was included from.  For example, if
       _/etc/sudoers_ contains the line:

           @include sudoers.local

       the file that will be included is _/etc/sudoers.local_.

       The file name may also include the ‘%h’ escape, signifying the short form of the  host  name.
       In other words, if the machine's host name is “xerxes”, then

           @include /etc/sudoers.%h

       will  cause **sudo **to include the file _/etc/sudoers.xerxes_.  Any path name separator characters
       (‘/’) present in the host name will be replaced with an underbar (‘_’) during expansion.

       The _@includedir_ directive can be used to create a _sudoers.d_ directory that the system package
       manager can drop _sudoers_ file rules into as  part  of  package  installation.   For  example,
       given:

           @includedir /etc/sudoers.d

       **sudo  **will suspend processing of the current file and read each file in _/etc/sudoers.d_, skip‐
       ping file names that end in ‘~’ or contain a ‘.’ character to  avoid  causing  problems  with
       package manager or editor temporary/backup files.

       Files  are  parsed  in sorted lexical order.  That is, _/etc/sudoers.d/01_first_ will be parsed
       before _/etc/sudoers.d/10_second_.  Be aware that because the sorting is lexical, not  numeric,
       _/etc/sudoers.d/1_whoops_  would  be loaded _after_ _/etc/sudoers.d/10_second_.  Using a consistent
       number of leading zeroes in the file names can be used to avoid such problems.  After parsing
       the files in the directory, control returns to the file that contained the _@includedir_ direc‐
       tive.

       Unlike files included via _@include_, **visudo **will not edit the files in a _@includedir_ directory
       unless one of them contains a syntax error.  It is still possible to run **visudo **with  the  **-f**
       flag to edit the files directly, but this will not catch the redefinition of an _alias_ that is
       also present in a different file.

### Other special characters and reserved words
       The pound sign (‘#’) is used to indicate a comment (unless it is part of a #include directive
       or  unless  it occurs in the context of a user name and is followed by one or more digits, in
       which case it is treated as a user-ID).  Both the comment character and any text after it, up
       to the end of the line, are ignored.

       The reserved word **ALL **is a built-in _alias_ that always causes a match to succeed.  It  can  be
       used  wherever  one might otherwise use a _Cmnd_Alias_, _User_Alias_, _Runas_Alias_, or _Host_Alias_.
       Attempting to define an _alias_ named **ALL **will result in a syntax error.  Using **ALL **can be dan‐
       gerous since in a command context, it allows the user to run _any_ command on the system.

       The following option names permitted in an _Option_Spec_ are also  considered  reserved  words:
       CHROOT, ROLE, TYPE, TIMEOUT, CWD, NOTBEFORE and NOTAFTER.  Attempting to define an _alias_ with
       the same name as one of the options will result in a syntax error.

       An  exclamation  point (‘!’) can be used as a logical _not_ operator in a list or _alias_ as well
       as in front of a _Cmnd_.  This allows one to exclude certain values.  For the ‘!’  operator  to
       be effective, there must be something for it to exclude.  For example, to match all users ex‐
       cept for **root **one would use:

           ALL, !root

       If the **ALL**, is omitted, as in:

           !root

       it  would  explicitly deny **root **but not match any other users.  This is different from a true
       “negation” operator.

       Note, however, that using a ‘!’ in conjunction with the built-in **ALL **alias to allow a user to
       run “all but a few” commands rarely works as intended (see “SECURITY NOTES” below).

       Long lines can be continued with a backslash (‘\’) as the last character on the line.

       White space between elements in a list as well as special  syntactic  characters  in  a  _User_
       _Specification_ (‘=’, ‘:’, ‘(’, ‘)’) is optional.

       The  following  characters must be escaped with a backslash (‘\’) when used as part of a word
       (e.g., a user name or host name): ‘!’, ‘=’, ‘:’, ‘,’, ‘(’, ‘)’, ‘\’.

## SUDOERS OPTIONS
       **sudo**'s behavior can be modified by _Default_Entry_ lines, as explained earlier.  A list of  all
       supported Defaults parameters, grouped by type, are listed below.

       **Boolean Flags**:

       always_query_group_plugin
                         If  a  _group_plugin_  is  configured,  use  it to resolve groups of the form
                         ‘%group’ as long as there is not also a system  group  of  the  same  name.
                         Normally, only groups of the form ‘%:group’ are passed to the _group_plugin_.
                         This flag is _off_ by default.

       always_set_home   If  enabled, **sudo **will set the HOME environment variable to the home direc‐
                         tory of the target user (which is the _runas_default_ user unless the **-u  **op‐
                         tion  is used).  This flag is largely obsolete and has no effect unless the
                         _env_reset_ flag has been disabled or HOME is present in the  _env_keep_  list,
                         both of which are strongly discouraged.  This flag is _off_ by default.

       authenticate      If  set,  users must authenticate themselves via a password (or other means
                         of authentication) before they may run commands.  This default may be over‐
                         ridden via the PASSWD and NOPASSWD tags.  This flag is _on_ by default.

       case_insensitive_group
                         If enabled, group names in _sudoers_ will be matched in  a  case  insensitive
                         manner.   This  may be necessary when users are stored in LDAP or AD.  This
                         flag is _on_ by default.

       case_insensitive_user
                         If enabled, user names in _sudoers_ will be matched  in  a  case  insensitive
                         manner.   This may be necessary when groups are stored in LDAP or AD.  This
                         flag is _on_ by default.

       closefrom_override
                         If set, the user may use the **-C **option which overrides the default starting
                         point at which **sudo **begins closing open file descriptors.  This flag is _off_
                         by default.

       compress_io       If set, and **sudo **is configured to log a command's input or output, the  I/O
                         logs  will  be compressed using **zlib**.  This flag is _on_ by default when **sudo**
                         is compiled with **zlib **support.

       exec_background   By default, **sudo **runs a command as the foreground process as long  as  **sudo**
                         itself  is running in the foreground.  When the _exec_background_ flag is en‐
                         abled and the command is being run in a pseudo-terminal (due to I/O logging
                         or the _use_pty_ flag), the command will be run as a background process.  At‐
                         tempts to read from the controlling terminal (or to  change  terminal  set‐
                         tings)  will  result in the command being suspended with the SIGTTIN signal
                         (or SIGTTOU in the case of terminal settings).  If this happens  when  **sudo**
                         is a foreground process, the command will be granted the controlling termi‐
                         nal  and resumed in the foreground with no user intervention required.  The
                         advantage of initially running the command in the background is  that  **sudo**
                         need  not read from the terminal unless the command explicitly requests it.
                         Otherwise, any terminal input must be passed to the command, whether it has
                         required it or not (the kernel buffers terminals so it is not  possible  to
                         tell  whether  the command really wants the input).  This is different from
                         historic _sudo_ behavior or when the command is not being run  in  a  pseudo-
                         terminal.

                         For  this  to  work seamlessly, the operating system must support the auto‐
                         matic restarting of system calls.  Unfortunately, not all operating systems
                         do this by default, and even those that do may have bugs.  For example, ma‐
                         cOS fails to restart the [_tcgetattr_(3)](https://www.chedong.com/phpMan.php/man/tcgetattr/3/markdown) and [_tcsetattr_(3)](https://www.chedong.com/phpMan.php/man/tcsetattr/3/markdown) functions (this is a
                         bug in macOS).  Furthermore, because this behavior depends on  the  command
                         stopping  with  the  SIGTTIN  or SIGTTOU signals, programs that catch these
                         signals and suspend themselves with a  different  signal  (usually  SIGTOP)
                         will  not  be automatically foregrounded.  Some versions of the linux [_su_(1)](https://www.chedong.com/phpMan.php/man/su/1/markdown)
                         command behave this way.  This flag is _off_ by default.

                         This setting is only supported by version 1.8.7 or higher.  It has  no  ef‐
                         fect unless I/O logging is enabled or the _use_pty_ flag is enabled.

       env_editor        If  set, **visudo **will use the value of the SUDO_EDITOR, VISUAL or EDITOR en‐
                         vironment variables before falling back on the default editor list.  **visudo**
                         is typically run as **root **so this flag may allow a user with  **visudo  **privi‐
                         leges to run arbitrary commands as **root **without logging.  An alternative is
                         to  place  a colon-separated list of “safe” editors int the _editor_ setting.
                         **visudo **will then only use SUDO_EDITOR, VISUAL or EDITOR  if  they  match  a
                         value  specified  in  _editor_.   If  the  _env_reset_  flag  is  enabled,  the
                         SUDO_EDITOR, VISUAL and/or EDITOR environment variables must be present  in
                         the  _env_keep_  list  for the _env_editor_ flag to function when **visudo **is in‐
                         voked via **sudo**.  This flag is _on_ by default.

       env_reset         If set, **sudo **will run the command in a minimal environment  containing  the
                         TERM,  PATH,  HOME,  MAIL,  SHELL, LOGNAME, USER and SUDO_* variables.  Any
                         variables in the caller's environment or  in  the  file  specified  by  the
                         _restricted_env_file_ setting that match the _env_keep_ and _env_check_ lists are
                         then  added, followed by any variables present in the file specified by the
                         _env_file_ setting (if any).  The contents  of  the  _env_keep_  and  _env_check_
                         lists,  as modified by global Defaults parameters in _sudoers_, are displayed
                         when **sudo **is run by **root **with the **-V **option.  If the _secure_path_ setting is
                         enabled, its value will be used for the PATH  environment  variable.   This
                         flag is _on_ by default.

       fast_glob         Normally,  **sudo  **uses  the [_glob_(3)](https://www.chedong.com/phpMan.php/man/glob/3/markdown) function to do shell-style globbing when
                         matching path names.  However, since it accesses the file  system,  [_glob_(3)](https://www.chedong.com/phpMan.php/man/glob/3/markdown)
                         can  take  a  long  time to complete for some patterns, especially when the
                         pattern references a network file system that is mounted  on  demand  (auto
                         mounted).   The  _fast_glob_ flag causes **sudo **to use the [_fnmatch_(3)](https://www.chedong.com/phpMan.php/man/fnmatch/3/markdown) function,
                         which does not access the file system to do its matching.  The disadvantage
                         of _fast_glob_ is that it is unable to match relative paths such as  _./ls_  or
                         _../bin/ls_.   This  has  security  implications when path names that include
                         globbing characters are used with the negation operator, ‘!’, as such rules
                         can be trivially bypassed.  As such, this flag should not be used when  the
                         _sudoers_  file  contains rules that contain negated path names which include
                         globbing characters.  This flag is _off_ by default.

       log_passwords     Most programs that require a user's password will disable echo before read‐
                         ing the password to avoid displaying the plaintext password on the  screen.
                         However,  if  terminal input is being logged (see “I/O LOGGING”), the pass‐
                         word will still be present in the I/O log.  If the _log_passwords_ option  is
                         disabled,  **sudoers **will attempt to prevent passwords from being logged.  It
                         does this by using the regular expressions in _passprompt_regex_ to  match  a
                         password  prompt in the terminal output buffer.  When a match is found, in‐
                         put characters in the I/O log will be replaced with ‘*’ until either a line
                         feed or carriage return is found in the terminal input or  a  new  terminal
                         output  buffer  is received.  If, however, a program displays characters as
                         the user types (such as **sudo **when _pwfeedback_ is set), only the first  char‐
                         acter  of the password will be replaced in the I/O log.  This option has no
                         effect unless _log_input_ or _log_ttyin_ are also set.  This flag is _on_ by  de‐
                         fault.

                         This setting is only supported by version 1.9.10 or higher.

       fqdn              Set  this flag if you want to put fully qualified host names in the _sudoers_
                         file when the local host name (as returned by the ‘hostname’ command)  does
                         not  contain  the domain name.  In other words, instead of myhost you would
                         use myhost.mydomain.edu.  You may still use the short form if you wish (and
                         even mix the two).  This flag is only effective when the  “canonical”  host
                         name,  as returned by the [_getaddrinfo_(3)](https://www.chedong.com/phpMan.php/man/getaddrinfo/3/markdown) or [_gethostbyname_(3)](https://www.chedong.com/phpMan.php/man/gethostbyname/3/markdown) function, is a
                         fully-qualified domain name.  This is usually the case when the  system  is
                         configured to use DNS for host name resolution.

                         If  the  system  is  configured to use the _/etc/hosts_ file in preference to
                         DNS, the “canonical” host name may not be fully-qualified.  The order  that
                         sources  are  queried  for host name resolution is usually specified in the
                         _/etc/nsswitch.conf_, _/etc/netsvc.conf_, _/etc/host.conf_, or,  in  some  cases,
                         _/etc/resolv.conf_  file.  In the _/etc/hosts_ file, the first host name of the
                         entry is considered to  be  the  “canonical”  name;  subsequent  names  are
                         aliases  that  are  not  used by **sudoers**.  For example, the following hosts
                         file line for the machine “xyzzy” has the fully-qualified  domain  name  as
                         the “canonical” host name, and the short version as an alias.

                               **192.168.1.1 xyzzy.sudo.ws xyzzy**

                         If  the machine's hosts file entry is not formatted properly, the _fqdn_ flag
                         will not be effective if it is queried before DNS.

                         Beware that when using DNS for host name resolution, turning  on  _fqdn_  re‐
                         quires **sudoers **to make DNS lookups which renders **sudo **unusable if DNS stops
                         working  (for  example  if  the  machine is disconnected from the network).
                         Just like with the hosts file, you must use the  “canonical”  name  as  DNS
                         knows  it.  That is, you may not use a host alias (CNAME entry) due to per‐
                         formance issues and the fact that there is no way to get all  aliases  from
                         DNS.

                         This flag is _on_ by default.

       ignore_audit_errors
                         Allow commands to be run even if **sudoers **cannot write to the audit log.  If
                         enabled,  an  audit  log write failure is not treated as a fatal error.  If
                         disabled, a command may only be run after the audit event  is  successfully
                         written.  This flag is only effective on systems for which **sudoers **supports
                         audit  logging, including FreeBSD, Linux, macOS, and Solaris.  This flag is
                         _on_ by default.

       ignore_dot        If set, **sudo **will ignore "." or "" (both denoting the current directory) in
                         the PATH environment variable; the PATH itself is not modified.  This  flag
                         is _off_ by default.

       ignore_iolog_errors
                         Allow commands to be run even if **sudoers **cannot write to the I/O log (local
                         or remote).  If enabled, an I/O log write failure is not treated as a fatal
                         error.   If  disabled, the command will be terminated if the I/O log cannot
                         be written to.  This flag is _off_ by default.

       ignore_logfile_errors
                         Allow commands to be run even if **sudoers **cannot write to the log file.   If
                         enabled, a log file write failure is not treated as a fatal error.  If dis‐
                         abled,  a  command may only be run after the log file entry is successfully
                         written.  This flag only has an effect when **sudoers **is  configured  to  use
                         file-based logging via the _logfile_ setting.  This flag is _on_ by default.

       ignore_local_sudoers
                         If set via LDAP, parsing of _/etc/sudoers_ will be skipped.  This is intended
                         for  sites  that  wish  to prevent the usage of local sudoers files so that
                         only LDAP is used.  This thwarts the efforts of rogue operators  who  would
                         attempt  to  add  roles  to  _/etc/sudoers_.   When  this  flag  is  enabled,
                         _/etc/sudoers_ does not even need to exist.  Since this flag tells  **sudo  **how
                         to  behave when no specific LDAP entries have been matched, this sudoOption
                         is only meaningful for the ‘cn=defaults’ section.  This flag is _off_ by  de‐
                         fault.

       ignore_unknown_defaults
                         If  set,  **sudo  **will  not produce a warning if it encounters an unknown De‐
                         faults entry in the _sudoers_ file or an unknown sudoOption  in  LDAP.   This
                         flag is _off_ by default.

       insults           If set, **sudo **will insult users when they enter an incorrect password.  This
                         flag is _off_ by default.

       log_allowed       If set, **sudoers **will log commands allowed by the policy to the system audit
                         log (where supported) as well as to syslog and/or a log file.  This flag is
                         _on_ by default.

                         This setting is only supported by version 1.8.29 or higher.

       log_denied        If  set, **sudoers **will log commands denied by the policy to the system audit
                         log (where supported) as well as to syslog and/or a log file.  This flag is
                         _on_ by default.

                         This setting is only supported by version 1.8.29 or higher.

       log_exit_status   If set, **sudoers **will log the exit value of commands that are run to  syslog
                         and/or  a  log  file.   If a command was terminated by a signal, the signal
                         name is logged as well.  This flag is _off_ by default.

                         This setting is only supported by version 1.9.8 or higher.

       log_host          If set, the host name will be included in log entries written to  the  file
                         configured by the _logfile_ setting.  This flag is _off_ by default.

       log_input         If  set,  **sudo  **will  run the command in a pseudo-terminal (if **sudo **was run
                         from a terminal) and log all user input.  If the standard input is not con‐
                         nected to the user's terminal, due to I/O redirection or because  the  com‐
                         mand  is  part of a pipeline, that input is also logged.  For more informa‐
                         tion about I/O logging, see the “I/O LOGGING” section.  This flag is _off_ by
                         default.

       log_output        If set, **sudo **will run the command in a pseudo-terminal  (if  **sudo  **was  run
                         from  a  terminal)  and log all output that is sent to the user's terminal,
                         the standard output or the standard error.  If the standard output or stan‐
                         dard error is not connected to the user's terminal, due to I/O  redirection
                         or  because  the command is part of a pipeline, that output is also logged.
                         For more information about I/O logging,  see  the  “I/O  LOGGING”  section.
                         This flag is _off_ by default.

       log_server_keepalive
                         If  set, **sudo **will enable the TCP keepalive socket option on the connection
                         to the log server.  This enables the  periodic  transmission  of  keepalive
                         messages  to  the server.  If the server does not respond to a message, the
                         connection will be closed and the running command will be terminated unless
                         the _ignore_iolog_errors_ flag (I/O logging enabled) or the _ignore_log_errors_
                         flag (I/O logging disabled) is set.  This flag is _on_ by default.

                         This setting is only supported by version 1.9.0 or higher.

       log_server_verify
                         If set, the server certificate received during the TLS  handshake  must  be
                         valid  and it must contain either the server name (from _log_servers_) or its
                         IP address.  If either of these conditions is not met,  the  TLS  handshake
                         will fail.  This flag is _on_ by default.

                         This setting is only supported by version 1.9.0 or higher.

       log_stderr        If  set,  **sudo  **will  log  the standard error if it is not connected to the
                         user's terminal.  This can be used to log output to a pipe or redirected to
                         a file.  This flag is _off_  by  default  but  is  enabled  when  either  the
                         _log_output_ flag or the LOG_OUTPUT command tag is set.

       log_stdin         If  set,  **sudo  **will  log  the standard input if it is not connected to the
                         user's terminal.  This can be used to log input from a pipe  or  redirected
                         from  a  file.   This flag is _off_ by default but is enabled when either the
                         _log_input_ flag or the LOG_INPUT command tag is set.

       log_stdout        If set, **sudo **will log the standard output if it is  not  connected  to  the
                         user's terminal.  This can be used to log output to a pipe or redirected to
                         a  file.   This  flag  is  _off_  by  default  but is enabled when either the
                         _log_output_ flag or the LOG_OUTPUT command tag is set.

       log_subcmds       If set, **sudoers **will log when a command spawns a child process and executes
                         a program using the [_execve_(2)](https://www.chedong.com/phpMan.php/man/execve/2/markdown), [_execl_(3)](https://www.chedong.com/phpMan.php/man/execl/3/markdown),  [_execle_(3)](https://www.chedong.com/phpMan.php/man/execle/3/markdown),  [_execlp_(3)](https://www.chedong.com/phpMan.php/man/execlp/3/markdown),  [_execv_(3)](https://www.chedong.com/phpMan.php/man/execv/3/markdown),
                         [_execvp_(3)](https://www.chedong.com/phpMan.php/man/execvp/3/markdown),  [_execvpe_(3)](https://www.chedong.com/phpMan.php/man/execvpe/3/markdown),  or [_system_(3)](https://www.chedong.com/phpMan.php/man/system/3/markdown) library functions.  For example, if a
                         shell is run by **sudo**, the individual commands run via  the  shell  will  be
                         logged.  This flag is _off_ by default.

                         The  _log_subcmds_  flag  uses the same underlying mechanism as the _intercept_
                         setting.  Some commands may not work properly when _log_subcmds_ is  enabled,
                         due  to the way it intercepts sub-commands.  See “Preventing shell escapes”
                         for more information on what systems support this option  and  its  limita‐
                         tions.   This  setting  is only supported by version 1.9.8 or higher and is
                         incompatible  with  SELinux  RBAC  support  unless  the   system   supports
                         [_seccomp_(2)](https://www.chedong.com/phpMan.php/man/seccomp/2/markdown) filter mode.

       log_ttyin         If  set,  **sudo  **will run the command in a pseudo-terminal and log user key‐
                         strokes sent to the user's terminal, if one is present.  This flag  is  _off_
                         by  default  but is enabled when either the _log_input_ flag or the LOG_INPUT
                         command tag is set.  If no terminal is present, for example when running  a
                         remote command using [_ssh_(1)](https://www.chedong.com/phpMan.php/man/ssh/1/markdown), this flag will have no effect.

       log_ttyout        If  set,  **sudo **will run the command in a pseudo-terminal and log all output
                         displayed on the user's terminal, if one is present.  This flag is  _off_  by
                         default  but  is  enabled when either the _log_output_ flag or the LOG_OUTPUT
                         command tag is set.  If no terminal is present, for example when running  a
                         remote command using [_ssh_(1)](https://www.chedong.com/phpMan.php/man/ssh/1/markdown), this flag will have no effect.

       log_year          If  set,  the  four-digit  year will be logged in the (non-syslog) **sudo **log
                         file.  This flag is _off_ by default.

       long_otp_prompt   When validating with a One Time Password (OTP)  scheme  such  as  **S/Key  **or
                         **OPIE**,  a  two-line  prompt  is  used to make it easier to cut and paste the
                         challenge to a local window.  It's not as pretty as the  default  but  some
                         people find it more convenient.  This flag is _off_ by default.

       mail_all_cmnds    Send  mail  to  the _mailto_ user every time a user attempts to run a command
                         via **sudo **(this includes **sudoedit**).  No mail will be sent if the  user  runs
                         **sudo  **with  the **-l **or **-v **option unless there is an authentication error and
                         the _mail_badpass_ flag is also set.  This flag is _off_ by default.

       mail_always       Send mail to the _mailto_ user every time a user runs **sudo**.  This flag is _off_
                         by default.

       mail_badpass      Send mail to the _mailto_ user if the user running **sudo **does  not  enter  the
                         correct password.  If the command the user is attempting to run is not per‐
                         mitted by **sudoers **and one of the _mail_all_cmnds_, _mail_always_, _mail_no_host_,
                         _mail_no_perms_ or _mail_no_user_ flags are set, this flag will have no effect.
                         This flag is _off_ by default.

       mail_no_host      If set, mail will be sent to the _mailto_ user if the invoking user exists in
                         the  _sudoers_  file, but is not allowed to run commands on the current host.
                         This flag is _off_ by default.

       mail_no_perms     If set, mail will be sent to the _mailto_ user if the invoking  user  is  al‐
                         lowed  to  use  **sudo **but the command they are trying is not listed in their
                         _sudoers_ file entry or is explicitly denied.  This flag is _off_ by default.

       mail_no_user      If set, mail will be sent to the _mailto_ user if the invoking user is not in
                         the _sudoers_ file.  This flag is _on_ by default.

       match_group_by_gid
                         By default, **sudoers **will look up each group the user  is  a  member  of  by
                         group-ID to determine the group name (this is only done once).  The result‐
                         ing  list  of the user's group names is used when matching groups listed in
                         the _sudoers_ file.  This works well on systems where the  number  of  groups
                         listed  in  the  _sudoers_ file is larger than the number of groups a typical
                         user belongs to.  On systems where group lookups are slow, where users  may
                         belong to a large number of groups, or where the number of groups listed in
                         the _sudoers_ file is relatively small, it may be prohibitively expensive and
                         running  commands via **sudo **may take longer than normal.  On such systems it
                         may be faster to use the _match_group_by_gid_ flag  to  avoid  resolving  the
                         user's  group-IDs  to  group names.  In this case, **sudoers **must look up any
                         group name listed in the _sudoers_ file and use the group-ID instead  of  the
                         group name when determining whether the user is a member of the group.

                         If  _match_group_by_gid_  is  enabled,  group  database  lookups performed by
                         **sudoers **will be keyed by group name as opposed  to  group-ID.   On  systems
                         where  there are multiple sources for the group database, it is possible to
                         have conflicting group names or group-IDs in the local _/etc/group_ file  and
                         the  remote  group  database.   On  such  systems,  enabling  or  disabling
                         _match_group_by_gid_ can be used to choose whether group database queries are
                         performed by name (enabled) or ID (disabled),  which  may  aid  in  working
                         around group entry conflicts.

                         The  _match_group_by_gid_  flag  has no effect when _sudoers_ data is stored in
                         LDAP.  This flag is _off_ by default.

                         This setting is only supported by version 1.8.18 or higher.

       intercept         If set, all commands run via **sudo **will behave as if the INTERCEPT  tag  has
                         been  set,  unless overridden by an NOINTERCEPT tag.  Some commands may not
                         work properly when _intercept_ is enabled, due to the way it  intercept  sub-
                         commands.   See  the description of INTERCEPT and NOINTERCEPT above as well
                         as the “Preventing shell escapes” section at the end of this manual.   This
                         flag is _off_ by default.

                         This setting is only supported by version 1.9.8 or higher and is incompati‐
                         ble  with SELinux RBAC support unless the system supports [_seccomp_(2)](https://www.chedong.com/phpMan.php/man/seccomp/2/markdown) filter
                         mode.

       intercept_allow_setid
                         On most systems, the dynamic loader will ignore LD_PRELOAD (or the  equiva‐
                         lent)  when running set-user-ID and set-group-ID programs, effectively dis‐
                         abling intercept mode.  To prevent this from happening,  **sudoers  **will  not
                         permit  a  set-user-ID  or set-group-ID program to be run in intercept mode
                         unless _intercept_allow_setid_ is enable.  This flag has no effect unless the
                         _intercept_ flag is enabled or the INTERCEPT tag has been set  for  the  com‐
                         mand.   This flag is _on_ by default when the _intercept_type_ option is set to
                         _trace_, otherwise it default to _off_.

                         This setting is only supported by version 1.9.8 or higher.

       intercept_authenticate
                         If set, commands run by an intercepted process must be  authenticated  when
                         the  user's time stamp is not current.  For example, if a shell is run with
                         _intercept_ enabled, as soon as the invoking user's  time  stamp  is  out  of
                         date,  subsequent commands will need to be authenticated.  This flag has no
                         effect unless the _intercept_ flag is enabled or the INTERCEPT tag  has  been
                         set for the command.  This flag is _off_ by default.

                         This setting is only supported by version 1.9.8 or higher.

       intercept_verify  If  set,  **sudo  **will attempt to verify that a command run in intercept mode
                         has the expected path name, command line arguments and environment.

                         The process will be stopped after [_execve_(2)](https://www.chedong.com/phpMan.php/man/execve/2/markdown) has completed  but  before  the
                         new command has had a chance to run.  To verify the command, **sudo **will read
                         the command's path from _/proc/PID/exe_, the command line arguments and envi‐
                         ronment  from  the process's memory, and compare them against the arguments
                         that were passed to [_execve_(2)](https://www.chedong.com/phpMan.php/man/execve/2/markdown).  In the event of  a  mismatch,  the  command
                         will be sent a SIGKILL signal and terminated.

                         This  can help prevent a time of check versus time of use issue with inter‐
                         cept mode where the [_execve_(2)](https://www.chedong.com/phpMan.php/man/execve/2/markdown) arguments could be altered after the  **sudoers**
                         policy  check.  The checks can only be performed if the [_proc_(5)](https://www.chedong.com/phpMan.php/man/proc/5/markdown) file system
                         is available.  This flag has no effect unless the _intercept_ flag is enabled
                         or the INTERCEPT tag has been set for the command  and  the  _intercept_type_
                         option is set to _trace_.

                         This setting is incompatible with programs that change their root directory
                         via [_chroot_(2)](https://www.chedong.com/phpMan.php/man/chroot/2/markdown).  If a program changes its root directory, path names will no
                         longer match those seen by the **sudo **parent process and sub-commands will be
                         terminated before they have a chance to run.  This flag is _on_ by default.

                         This setting is only supported by version 1.9.12 or higher.

       netgroup_tuple    If  set,  netgroup lookups will be performed using the full netgroup tuple:
                         host name, user name, and domain (if one is set).  Historically, **sudo  **only
                         matched the user name and domain for netgroups used in a _User_List_ and only
                         matched  the  host name and domain for netgroups used in a _Host_List_.  This
                         flag is _off_ by default.

       noexec            If set, all commands run via **sudo **will behave as if the NOEXEC tag has been
                         set, unless overridden by an EXEC tag.  See the  description  of  EXEC  and
                         NOEXEC  above  as well as the “Preventing shell escapes” section at the end
                         of this manual.  This flag is _off_ by default.

       noninteractive_auth
                         If set, authentication will be attempted even in non-interactive mode (when
                         **sudo**'s **-n **option is specified).  This allows  authentication  methods  that
                         don't require user interaction to succeed.  Authentication methods that re‐
                         quire input from the user's terminal will still fail.  If disabled, authen‐
                         tication  will  not be attempted in non-interactive mode.  This flag is _off_
                         by default.

                         This setting is only supported by version 1.9.10 or higher.

       pam_acct_mgmt     On systems that use PAM for authentication, **sudo **will perform  PAM  account
                         validation  for  the invoking user by default.  The actual checks performed
                         depend on which PAM modules are configured.  If enabled, account validation
                         will be performed regardless of whether or  not  a  password  is  required.
                         This flag is _on_ by default.

                         This setting is only supported by version 1.8.28 or higher.

       pam_rhost         On  systems  that  use PAM for authentication, **sudo **will set the PAM remote
                         host value to the name of the local host when the  _pam_rhost_  flag  is  en‐
                         abled.   On  Linux systems, enabling _pam_rhost_ may result in DNS lookups of
                         the local host name when PAM is initialized.  On Solaris versions prior  to
                         Solaris  8, _pam_rhost_ must be enabled if _pam_ruser_ is also enabled to avoid
                         a crash in the Solaris PAM implementation.

                         This flag is _off_ by default on systems other than Solaris.

                         This setting is only supported by version 1.9.0 or higher.

       pam_ruser         On systems that use PAM for authentication, **sudo **will set  the  PAM  remote
                         user  value  to  the  name of the user that invoked sudo when the _pam_ruser_
                         flag is enabled.  This flag is _on_ by default.

                         This setting is only supported by version 1.9.0 or higher.

       pam_session       On systems that use PAM for authentication, **sudo **will create a new PAM ses‐
                         sion for the command to be run in.  Unless **sudo **is given the **-i **or  **-s  **op‐
                         tions,  PAM  session  modules are run with the “silent” flag enabled.  This
                         prevents last login information from being displayed for every  command  on
                         some systems.  Disabling _pam_session_ may be needed on older PAM implementa‐
                         tions  or on operating systems where opening a PAM session changes the utmp
                         or wtmp files.  If PAM session support is disabled, resource limits may not
                         be updated for the command being run.   If  _pam_session_,  _pam_setcred_,  and
                         _use_pty_  are disabled, _log_servers_ has not been set and I/O logging has not
                         been configured, **sudo **will execute the command directly instead of  running
                         it as a child process.  This flag is _on_ by default.

                         This setting is only supported by version 1.8.7 or higher.

       pam_setcred       On  systems that use PAM for authentication, **sudo **will attempt to establish
                         credentials for the target user by default, if supported by the  underlying
                         authentication  system.   One example of a credential is a Kerberos ticket.
                         If _pam_session_, _pam_setcred_, and _use_pty_ are disabled, _log_servers_ has  not
                         been  set  and  I/O  logging has not been configured, **sudo **will execute the
                         command directly instead of running it as a child process.  This flag is _on_
                         by default.

                         This setting is only supported by version 1.8.8 or higher.

       passprompt_override
                         If set, the prompt specified by _passprompt_ or the  SUDO_PROMPT  environment
                         variable  will always be used and will replace the prompt provided by a PAM
                         module or other authentication method.  This flag is _off_ by default.

       path_info         Normally, **sudo **will tell the user when a command  could  not  be  found  in
                         their PATH environment variable.  Some sites may wish to disable this as it
                         could be used to gather information on the location of executables that the
                         normal  user does not have access to.  The disadvantage is that if the exe‐
                         cutable is simply not in the user's PATH, **sudo **will tell the user that they
                         are not allowed to run it, which can be confusing.  This flag is _on_ by  de‐
                         fault.

       preserve_groups   By default, **sudo **will initialize the group vector to the list of groups the
                         target  user is in.  When _preserve_groups_ is set, the user's existing group
                         vector is left unaltered.  The real and effective group-IDs,  however,  are
                         still set to match the target user.  This flag is _off_ by default.

       pwfeedback        By default, **sudo **reads the password like most other Unix programs, by turn‐
                         ing off echo until the user hits the return (or enter) key.  Some users be‐
                         come  confused  by  this  as  it appears to them that **sudo **has hung at this
                         point.  When _pwfeedback_ is set, **sudo **will provide visual feedback when  the
                         user presses a key.  This does have a security impact as an onlooker may be
                         able  to  determine the length of the password being entered.  This flag is
                         _off_ by default.

       requiretty        If set, **sudo **will only run when the user is logged in to a real tty.   When
                         this  flag  is  set,  **sudo **can only be run from a login session and not via
                         other means such as [_cron_(8)](https://www.chedong.com/phpMan.php/man/cron/8/markdown) or cgi-bin scripts.  This flag is  _off_  by  de‐
                         fault.

       root_sudo         If  set,  **root  **is  allowed to run **sudo **too.  Disabling this prevents users
                         from “chaining” **sudo **commands to get a **root **shell by doing  something  like
                         ‘sudo  sudo  /bin/sh’.  Note, however, that turning off _root_sudo_ will also
                         prevent **root **from running **sudoedit**.  Disabling _root_sudo_ provides  no  real
                         additional security; it exists purely for historical reasons.  This flag is
                         _on_ by default.

       rootpw            If  set,  **sudo **will prompt for the **root **password instead of the password of
                         the invoking user when running a command or editing a file.  This  flag  is
                         _off_ by default.

       runas_allow_unknown_id
                         If enabled, allow matching of runas user and group IDs that are not present
                         in the password or group databases.  In addition to explicitly matching un‐
                         known  user  or  group IDs in a _Runas_List_, this option also allows the **ALL**
                         alias to match unknown IDs.  This flag is _off_ by default.

                         This setting is only supported by version 1.8.30 or higher.  Older versions
                         of **sudo **always allowed matching of unknown user and group IDs.

       runas_check_shell
                         If enabled, **sudo **will only run commands as a user whose  shell  appears  in
                         the  _/etc/shells_  file, even if the invoking user's _Runas_List_ would other‐
                         wise permit it.  If no _/etc/shells_ file is present, a system-dependent list
                         of built-in default shells is used.   On  many  operating  systems,  system
                         users such as “bin”, do not have a valid shell and this flag can be used to
                         prevent  commands  from  being run as those users.  This flag is _off_ by de‐
                         fault.

                         This setting is only supported by version 1.8.30 or higher.

       runaspw           If set, **sudo **will prompt for the  password  of  the  user  defined  by  the
                         _runas_default_  option (defaults to **root**) instead of the password of the in‐
                         voking user when running a command or editing a file.  This flag is _off_  by
                         default.

       selinux           If  enabled,  the  user may specify an SELinux role and/or type to use when
                         running the command, as permitted by the SELinux  policy.   If  SELinux  is
                         disabled  on  the  system, this flag has no effect.  This flag is _on_ by de‐
                         fault.

       set_home          If enabled and **sudo **is invoked with the **-s  **option,  the  HOME  environment
                         variable will be set to the home directory of the target user (which is the
                         _runas_default_ user unless the **-u **option is used).  This flag is largely ob‐
                         solete  and  has  no  effect unless the _env_reset_ flag has been disabled or
                         HOME is present in the _env_keep_ list, both of which are  strongly  discour‐
                         aged.  This flag is _off_ by default.

       set_logname       Normally,  **sudo  **will set the LOGNAME and USER environment variables to the
                         name of the target user (the user specified by _runas_default_ unless the  **-u**
                         option is given).  However, since some programs (including the RCS revision
                         control  system) use LOGNAME to determine the real identity of the user, it
                         may be desirable to change this behavior.  This can be done by negating the
                         set_logname option.  The _set_logname_ option will  have  no  effect  if  the
                         _env_reset_  option  has  not  been  disabled  and the _env_keep_ list contains
                         LOGNAME or USER.  This flag is _on_ by default.

       set_utmp          When enabled, **sudo **will create an entry in the utmp (or utmpx) file when  a
                         pseudo-terminal  is allocated.  A pseudo-terminal is allocated by **sudo **when
                         it is running in a terminal and one or more of the  _log_input_,  _log_output_,
                         _log_stdin_,  _log_stdout_, _log_stderr_, _log_ttyin_, _log_ttyout_, or _use_pty_ flags
                         is enabled.  By default, the new entry will be a copy of the user's  exist‐
                         ing  utmp entry (if any), with the tty, time, type, and pid fields updated.
                         This flag is _on_ by default.

       setenv            Allow the user to disable the _env_reset_ option from the  command  line  via
                         the  **-E  **option.   Additionally,  environment variables set via the command
                         line are not subject to the restrictions imposed by _env_check_,  _env_delete_,
                         or  _env_keep_.   As  such, only trusted users should be allowed to set vari‐
                         ables in this manner.  This flag is _off_ by default.

       shell_noargs      If set and **sudo **is invoked with no arguments it acts as if  the  **-s  **option
                         had  been given.  That is, it runs a shell as **root **(the shell is determined
                         by the SHELL environment variable if it is set, falling back on  the  shell
                         listed  in the invoking user's /etc/passwd entry if not).  This flag is _off_
                         by default.

       stay_setuid       Normally, when **sudo **executes a command the real and effective user-IDs  are
                         set  to the target user (**root **by default).  This option changes that behav‐
                         ior such that the real user-ID is left as the invoking user's user-ID.   In
                         other  words,  this  makes  **sudo **act as a set-user-ID wrapper.  This can be
                         useful on systems that disable  some  potentially  dangerous  functionality
                         when  a  program is run set-user-ID.  This option is only effective on sys‐
                         tems that support either the [_setreuid_(2)](https://www.chedong.com/phpMan.php/man/setreuid/2/markdown) or [_setresuid_(2)](https://www.chedong.com/phpMan.php/man/setresuid/2/markdown) system call.  This
                         flag is _off_ by default.

       sudoedit_checkdir
                         If set, **sudoedit **will check all directory components  of  the  path  to  be
                         edited  for  writability  by the invoking user.  Symbolic links will not be
                         followed in writable directories and **sudoedit **will refuse to  edit  a  file
                         located  in a writable directory.  These restrictions are not enforced when
                         **sudoedit **is run by **root**.  On some systems, if all directory  components  of
                         the path to be edited are not readable by the target user, **sudoedit **will be
                         unable to edit the file.  This flag is _on_ by default.

                         This  setting was first introduced in version 1.8.15 but initially suffered
                         from a race condition.  The check for symbolic links in writable intermedi‐
                         ate directories was added in version 1.8.16.

       sudoedit_follow   By default, **sudoedit **will not follow symbolic  links  when  opening  files.
                         The  _sudoedit_follow_  option  can be enabled to allow **sudoedit **to open sym‐
                         bolic links.  It may be overridden on a per-command basis by the FOLLOW and
                         NOFOLLOW tags.  This flag is _off_ by default.

                         This setting is only supported by version 1.8.15 or higher.

       syslog_pid        When logging via [_syslog_(3)](https://www.chedong.com/phpMan.php/man/syslog/3/markdown), include the process ID in the log entry.   This
                         flag is _off_ by default.

                         This setting is only supported by version 1.8.21 or higher.

       targetpw          If  set,  **sudo **will prompt for the password of the user specified by the **-u**
                         option (defaults to the value of _runas_default_) instead of the password  of
                         the invoking user when running a command or editing a file.  This flag pre‐
                         cludes  the  use of a user-ID not listed in the passwd database as an argu‐
                         ment to the **-u **option.  This flag is _off_ by default.

       tty_tickets       If set, users must authenticate on a per-tty basis.   With  this  flag  en‐
                         abled, **sudo **will use a separate record in the time stamp file for each ter‐
                         minal.  If disabled, a single record is used for all login sessions.

                         This option has been superseded by the _timestamp_type_ option.

       umask_override    If  set,  **sudo  **will set the umask as specified in the _sudoers_ file without
                         modification.  This makes it possible to specify a  umask  in  the  _sudoers_
                         file that is more permissive than the user's own umask and matches histori‐
                         cal  behavior.  If _umask_override_ is not set, **sudo **will set the umask to be
                         the union of the user's umask and what is specified in _sudoers_.  This  flag
                         is _off_ by default.

       use_netgroups     If  set,  netgroups  (prefixed with ‘+’), may be used in place of a user or
                         host.  For LDAP-based sudoers, netgroup support requires an expensive  sub-
                         string match on the server unless the **NETGROUP_BASE **directive is present in
                         the  _/etc/ldap.conf_  file.  If netgroups are not needed, this option can be
                         disabled to reduce the load on the LDAP server.  This flag  is  _on_  by  de‐
                         fault.

       use_pty           If set, and **sudo **is running in a terminal, the command will be run in a new
                         pseudo-terminal.   If  the  **sudo  **process  is  not  attached to a terminal,
                         _use_pty_ has no effect.

                         A malicious program run under **sudo **may be  capable  of  injecting  commands
                         into  the  user's terminal or running a background process that retains ac‐
                         cess to the user's terminal device even after the main program has finished
                         executing.  By running the command in a separate pseudo-terminal, this  at‐
                         tack is no longer possible.  This flag is _on_ by default for **sudo **1.9.14 and
                         above.

       user_command_timeouts
                         If set, the user may specify a timeout on the command line.  If the timeout
                         expires  before the command has exited, the command will be terminated.  If
                         a timeout is specified both in the _sudoers_ file and on  the  command  line,
                         the smaller of the two timeouts will be used.  See the _Timeout_Spec_ section
                         for a description of the timeout syntax.  This flag is _off_ by default.

                         This setting is only supported by version 1.8.20 or higher.

       utmp_runas        If  set,  **sudo **will store the name of the runas user when updating the utmp
                         (or utmpx) file.  By default, **sudo **stores the name of  the  invoking  user.
                         This flag is _off_ by default.

       visiblepw         By  default,  **sudo **will refuse to run if the user must enter a password but
                         it is not possible to disable echo on the terminal.  If the _visiblepw_  flag
                         is  set,  **sudo  **will prompt for a password even when it would be visible on
                         the screen.  This makes it possible to run things like ‘ssh  somehost  sudo
                         ls’  since  by  default, [_ssh_(1)](https://www.chedong.com/phpMan.php/man/ssh/1/markdown) does not allocate a tty when running a com‐
                         mand.  This flag is _off_ by default.

       **Integers**:

       closefrom         Before it executes a command, **sudo **will close  all  open  file  descriptors
                         other  than  standard  input, standard output, and standard error (file de‐
                         scriptors 0-2).  The _closefrom_ option can be used to  specify  a  different
                         file descriptor at which to start closing.  The default is 3.

       command_timeout   The  maximum amount of time a command is allowed to run before it is termi‐
                         nated.  See the _Timeout_Spec_ section for a description of the timeout  syn‐
                         tax.

                         This setting is only supported by version 1.8.20 or higher.

       log_server_timeout
                         The maximum amount of time to wait when connecting to a log server or wait‐
                         ing  for a server response.  See the _Timeout_Spec_ section for a description
                         of the timeout syntax.  The default value is 30 seconds.

                         This setting is only supported by version 1.9.0 or higher.

       maxseq            The maximum sequence number that will be substituted for the  ‘%{seq}’  es‐
                         cape  in the I/O log file (see the _iolog_dir_ description below for more in‐
                         formation).  While the value substituted for ‘%{seq}’ is in base 36, _maxseq_
                         itself should be expressed  in  decimal.   Values  larger  than  2176782336
                         (which  corresponds  to  the  base  36  sequence  number  “ZZZZZZ”) will be
                         silently truncated to 2176782336.  The default value is 2176782336.

                         Once the local sequence number reaches the value of _maxseq_, it  will  “roll
                         over”  to  zero,  after which **sudoers **will truncate and re-use any existing
                         I/O log path names.

                         This setting is only supported by version 1.8.7 or higher.

       passwd_tries      The number of tries a user gets to enter his/her password before **sudo  **logs
                         the failure and exits.  The default is 3.

       syslog_maxlen     On  many  systems,  [_syslog_(3)](https://www.chedong.com/phpMan.php/man/syslog/3/markdown)  has a relatively small log buffer.  IETF RFC
                         5424 states that syslog servers must support messages of at least 480 bytes
                         and should support messages up to 2048 bytes.  By default, **sudoers  **creates
                         log  messages  up to 980 bytes which corresponds to the historic BSD syslog
                         implementation which used a 1024 byte buffer to store  the  message,  date,
                         hostname,  and  program  name.  To prevent syslog messages from being trun‐
                         cated,  **sudoers  **will  split  up  log  messages  that   are   larger   than
                         _syslog_maxlen_  bytes.   When  a message is split, additional parts will in‐
                         clude the string “(command continued)” after the user name and  before  the
                         continued command line arguments.

                         This setting is only supported by version 1.8.19 or higher.

       **Integers that can be used in a boolean context**:

       loglinelen        Number  of characters per line for the file log.  This value is used to de‐
                         cide when to wrap lines for nicer log files.  This has  no  effect  on  the
                         syslog log file, only the file log.  The default is 80 (use 0 or negate the
                         option to disable word wrap).

       passwd_timeout    Number  of  minutes  before the **sudo **password prompt times out, or 0 for no
                         timeout.  The timeout may include a fractional component if  minute  granu‐
                         larity is insufficient, for example 2.5.  The default is 0.

       timestamp_timeout
                         Number  of  minutes  that  can  elapse  before **sudo **will ask for a password
                         again.  The timeout may include a fractional component if minute  granular‐
                         ity is insufficient, for example 2.5.  The default is 15.  Set this to 0 to
                         always  prompt  for  a  password.  If set to a value less than 0 the user's
                         time stamp will not expire until the system is rebooted.  This can be  used
                         to  allow users to create or delete their own time stamps via ‘sudo -v’ and
                         ‘sudo -k’ respectively.

       umask             File mode creation mask to use when running the command.  Negate  this  op‐
                         tion  or set it to 0777 to prevent **sudoers **from changing the umask.  Unless
                         the _umask_override_ flag is set, the actual umask will be the union  of  the
                         user's  umask  and  the value of the _umask_ setting, which defaults to 0022.
                         This guarantees that **sudo **never lowers the umask when running a command.

                         If _umask_ is explicitly set in _sudoers_, it will override any  umask  setting
                         in  PAM or login.conf.  If _umask_ is not set in _sudoers_, the umask specified
                         by PAM or login.conf will take precedence.  The umask setting in PAM is not
                         used for **sudoedit**, which does not create a new PAM session.

       **Strings**:

       apparmor_profile  The default AppArmor profile to transition into when executing the command.
                         The default _apparmor_profile_ can be overridden for individual  _sudoers_  en‐
                         tries  by  specifying  the  APPARMOR_PROFILE  option.   This option is only
                         available when sudo is built with AppArmor support.

       authfail_message  Message that is displayed after a user fails to authenticate.  The  message
                         may include the ‘%d’ escape which will expand to the number of failed pass‐
                         word  attempts.   If  set,  it overrides the default message, “%d incorrect
                         password attempt(s)”.

       badpass_message   Message that is displayed if a user enters an incorrect password.  The  de‐
                         fault is “Sorry, try again.” unless insults are enabled.

       editor            A  colon  (‘:’)  separated  list  of editor path names used by **sudoedit **and
                         **visudo**.  For **sudoedit**, this list is used to find an editor when none of the
                         SUDO_EDITOR, VISUAL or EDITOR environment variables are set  to  an  editor
                         that  exists  and is executable.  For **visudo**, it is used as a white list of
                         allowed editors; **visudo **will choose the  editor  that  matches  the  user's
                         SUDO_EDITOR,  VISUAL  or  EDITOR  environment  variable if possible, or the
                         first editor in the list that exists and is executable if not.  Unless  in‐
                         voked as **sudoedit**, **sudo **does not preserve the SUDO_EDITOR, VISUAL or EDITOR
                         environment  variables  unless they are present in the _env_keep_ list or the
                         _env_reset_ option is disabled.  The default is _/usr/bin/editor_.

       intercept_type    The underlying mechanism used by the _intercept_ and _log_subcmds_ options.  It
                         has the following possible values:

                         dso     Preload a dynamic shared object (shared  library)  that  intercepts
                                 the [_execve_(2)](https://www.chedong.com/phpMan.php/man/execve/2/markdown), [_execl_(3)](https://www.chedong.com/phpMan.php/man/execl/3/markdown), [_execle_(3)](https://www.chedong.com/phpMan.php/man/execle/3/markdown), [_execlp_(3)](https://www.chedong.com/phpMan.php/man/execlp/3/markdown), [_execv_(3)](https://www.chedong.com/phpMan.php/man/execv/3/markdown), [_execvp_(3)](https://www.chedong.com/phpMan.php/man/execvp/3/markdown),
                                 [_execvpe_(3)](https://www.chedong.com/phpMan.php/man/execvpe/3/markdown), and [_system_(3)](https://www.chedong.com/phpMan.php/man/system/3/markdown) library functions.  A value of _dso_ is in‐
                                 compatible with **sudo**'s SELinux RBAC support.

                         trace   Use [_ptrace_(2)](https://www.chedong.com/phpMan.php/man/ptrace/2/markdown) to intercept the [_execve_(2)](https://www.chedong.com/phpMan.php/man/execve/2/markdown) system call.  This is only
                                 supported  on  Linux systems where [_seccomp_(2)](https://www.chedong.com/phpMan.php/man/seccomp/2/markdown) filtering is enabled.
                                 If the _/proc/sys/kernel/seccomp/actions_avail_ file  is  missing  or
                                 does  not contain a “trap” element, setting _intercept_type_ to _trace_
                                 will have no effect and _dso_ will be used instead.

                         The default is to use _trace_ if it is supported by the system and _dso_ if  it
                         is not.

       iolog_dir         The  top-level directory to use when constructing the path name for the in‐
                         put/output log directory.  Only used if the _log_input_ or _log_output_ options
                         are enabled or when the LOG_INPUT or LOG_OUTPUT tags are present for a com‐
                         mand.  The session sequence number, if any, is  stored  in  the  directory.
                         The default is _/var/log/sudo-io_.

                         The following percent (‘%’) escape sequences are supported:

                         %{seq}
                               expanded  to a monotonically increasing base-36 sequence number, such
                               as 0100A5, where every two digits are used to form a  new  directory,
                               e.g., _01/00/A5_

                         %{user}
                               expanded to the invoking user's login name

                         %{group}
                               expanded to the name of the invoking user's real group-ID

                         %{runas_user}
                               expanded  to  the  login  name of the user the command will be run as
                               (e.g., **root**)

                         %{runas_group}
                               expanded to the group name of the user the command  will  be  run  as
                               (e.g., **wheel**)

                         %{hostname}
                               expanded to the local host name without the domain name

                         %{command}
                               expanded to the base name of the command being run

                         In  addition,  any  escape  sequences supported by the system's [_strftime_(3)](https://www.chedong.com/phpMan.php/man/strftime/3/markdown)
                         function will be expanded.

                         To include a literal ‘%’ character, the string ‘%%’ should be used.

                         Any path name separator characters (‘/’) present in the user, group or host
                         name will be replaced with an underbar (‘_’) during expansion.

       iolog_file        The path name, relative to _iolog_dir_, in which to store  input/output  logs
                         when  the _log_input_ or _log_output_ options are enabled or when the LOG_INPUT
                         or LOG_OUTPUT tags are present for a command.  _iolog_file_ may  contain  di‐
                         rectory components.  The default is ‘%{seq}’.

                         See the _iolog_dir_ option above for a list of supported percent (‘%’) escape
                         sequences.

                         In  addition to the escape sequences, path names that end in six or more _X_s
                         will have the _X_s replaced with a unique combination of digits and  letters,
                         similar to the [_mktemp_(3)](https://www.chedong.com/phpMan.php/man/mktemp/3/markdown) function.

                         If  the  path created by concatenating _iolog_dir_ and _iolog_file_ already ex‐
                         ists, the existing I/O log file will be truncated  and  overwritten  unless
                         _iolog_file_ ends in six or more _X_s.

       iolog_flush       If  set,  **sudo  **will flush I/O log data to disk after each write instead of
                         buffering it.  This makes it possible to view the logs in real-time as  the
                         program  is executing but may significantly reduce the effectiveness of I/O
                         log compression.  This flag is _off_ by default.

                         This setting is only supported by version 1.8.20 or higher.

       iolog_group       The group name to look up when setting the group-ID on new  I/O  log  files
                         and  directories.   If  _iolog_group_ is not set, the primary group-ID of the
                         user  specified  by  _iolog_user_  is  used.   If  neither  _iolog_group_   nor
                         _iolog_user_ are set, I/O log files and directories are created with group-ID
                         0.

                         This setting is only supported by version 1.8.19 or higher.

       iolog_mode        The  file  mode to use when creating I/O log files.  Mode bits for read and
                         write permissions for owner, group, or other are honored,  everything  else
                         is  ignored.   The  file permissions will always include the owner read and
                         write bits, even if they are not present in the specified mode.  When  cre‐
                         ating  I/O  log  directories,  search (execute) bits are added to match the
                         read and write bits specified by _iolog_mode_.  Defaults to  0600  (read  and
                         write by user only).

                         This setting is only supported by version 1.8.19 or higher.

       iolog_user        The user name to look up when setting the user and group-IDs on new I/O log
                         files  and  directories.  If _iolog_group_ is set, it will be used instead of
                         the user's primary group-ID.  By default, I/O log files and directories are
                         created with user and group-ID 0.

                         This setting can be useful when the I/O logs are stored on a  Network  File
                         System  (NFS)  share.   Having a dedicated user own the I/O log files means
                         that **sudoers **does not write to the log files as user-ID 0, which is usually
                         not permitted by NFS.

                         This setting is only supported by version 1.8.19 or higher.

       lecture_status_dir
                         The directory in which **sudo **stores per-user lecture status files.   Once  a
                         user has received the lecture, a zero-length file is created in this direc‐
                         tory  so  that **sudo **will not lecture the user again.  This directory should
                         _not_   be   cleared   when   the   system   reboots.    The    default    is
                         _/var/lib/sudo/lectured_.

       log_server_cabundle
                         The  path to a certificate authority bundle file, in PEM format, to use in‐
                         stead of the system's default certificate authority database when authenti‐
                         cating the log server.  The default is to use the system's default certifi‐
                         cate authority database.  This setting has no effect unless _log_servers_  is
                         set and the remote log server is secured with TLS.

                         This setting is only supported by version 1.9.0 or higher.

       log_server_peer_cert
                         The  path  to the **sudo **client's certificate file, in PEM format.  This set‐
                         ting is required when the remote log server is secured with TLS and  client
                         certificate  validation  is  enabled.  For **sudo_logsrvd**, client certificate
                         validation is controlled by the _tls_checkpeer_  option,  which  defaults  to
                         _false_.

                         This setting is only supported by version 1.9.0 or higher.

       log_server_peer_key
                         The  path  to the **sudo **client's private key file, in PEM format.  This set‐
                         ting is required when the remote log server is secured with TLS and  client
                         certificate  validation  is  enabled.  For **sudo_logsrvd**, client certificate
                         validation is controlled by  the  _tls_checkpeer_  flag,  which  defaults  to
                         _false_.

                         This setting is only supported by version 1.9.0 or higher.

       mailsub           Subject  of  the mail sent to the _mailto_ user.  The escape ‘%h’ will expand
                         to the host name of the machine.  Default is “*** SECURITY information  for
                         %h ***”.

       noexec_file       As  of  **sudo **version 1.8.1 this option is no longer supported.  The path to
                         the noexec file should now be set in the [_sudo.conf_(5)](https://www.chedong.com/phpMan.php/man/sudo.conf/5/markdown) file.

       pam_askpass_service
                         On systems that use PAM for authentication, this is the service  name  used
                         when  the  **-A  **option  is specified.  The default value is either ‘sudo’ or
                         ‘sudo-i’, depending on whether or not the **-i **option is also specified.  See
                         the description of _pam_service_ for more information.

                         This setting is only supported by version 1.9.9 or higher.

       pam_login_service
                         On systems that use PAM for authentication, this is the service  name  used
                         when  the  **-i **option is specified.  The default value is ‘sudo-i’.  See the
                         description of _pam_service_ for more information.

                         This setting is only supported by version 1.8.8 or higher.

       pam_service       On systems that use PAM for authentication, the service name specifies  the
                         PAM  policy to apply.  This usually corresponds to an entry in the _pam.conf_
                         file or a file in the _/etc/pam.d_ directory.  The default value is ‘sudo’.

                         This setting is only supported by version 1.8.8 or higher.

       passprompt        The default prompt to use when asking for a password; can be overridden via
                         the **-p **option or the SUDO_PROMPT environment variable.  The following  per‐
                         cent (‘%’) escape sequences are supported:

                         %H    expanded  to  the  local host name including the domain name (only if
                               the machine's host name is fully qualified or the _fqdn_ option is set)

                         %h    expanded to the local host name without the domain name

                         %p    expanded to the user whose password is being asked for (respects  the
                               _rootpw_, _targetpw_ and _runaspw_ flags in _sudoers_)

                         %U    expanded  to  the  login  name of the user the command will be run as
                               (defaults to **root**)

                         %u    expanded to the invoking user's login name

                         %%    two consecutive ‘%’ characters are collapsed into a single ‘%’  char‐
                               acter

                         On systems that use PAM for authentication, _passprompt_ will only be used if
                         the  prompt  provided  by the PAM module matches the string “Password: ” or
                         “username's Password: ”.  This ensures that the _passprompt_ setting does not
                         interfere    with    challenge-response    style    authentication.     The
                         _passprompt_override_ flag can be used to change this behavior.

                         The default value is ‘[sudo] password for %p: ’.

       role              The default SELinux role to use when constructing a new security context to
                         run the command.  The default role may be overridden on a per-command basis
                         in  the  _sudoers_  file  or  via  command line options.  This option is only
                         available when **sudo **is built with SELinux support.

       runas_default     The default user to run commands as if the **-u **option is  not  specified  on
                         the command line.  This defaults to **root**.

       sudoers_locale    Locale  to use when parsing the sudoers file, logging commands, and sending
                         email.  Changing the locale may affect how  sudoers  is  interpreted.   De‐
                         faults to ‘C’.

       timestamp_type    **sudoers  **uses  per-user  time  stamp  files  for  credential  caching.  The
                         _timestamp_type_ option can be used to specify the type of time stamp  record
                         used.  It has the following possible values:

                         global  A  single  time stamp record is used for all of a user's login ses‐
                                 sions, regardless of the terminal or parent process ID.   An  addi‐
                                 tional  record  is  used to serialize password prompts when **sudo **is
                                 used multiple times in a pipeline, but this does not affect authen‐
                                 tication.

                         ppid    A single time stamp record is used for all processes with the  same
                                 parent  process ID (usually the shell).  Commands run from the same
                                 shell (or other common parent process) will not require a  password
                                 for  _timestamp_timeout_  minutes  (15 by default).  Commands run via
                                 **sudo **with a different parent process ID, for example from  a  shell
                                 script, will be authenticated separately.

                         tty     One time stamp record is used for each terminal, which means that a
                                 user's login sessions are authenticated separately.  If no terminal
                                 is  present,  the  behavior is the same as _ppid_.  Commands run from
                                 the same terminal will not require a password for _timestamp_timeout_
                                 minutes (15 by default).

                         kernel  The time stamp is stored in the kernel as an attribute of the  ter‐
                                 minal  device.  If no terminal is present, the behavior is the same
                                 as _ppid_.  Negative _timestamp_timeout_ values are not  supported  and
                                 positive  values  are  limited to a maximum of 60 minutes.  This is
                                 currently only supported on OpenBSD.

                         The default value is _tty_.

                         This setting is only supported by version 1.8.21 or higher.

       timestampdir      The directory in which **sudo **stores its time stamp  files.   This  directory
                         should be cleared when the system reboots.  The default is _/run/sudo/ts_.

       timestampowner    The  owner  of  the  lecture status directory, time stamp directory and all
                         files stored therein.  The default is **root**.

       type              The default SELinux type to use when constructing a new security context to
                         run the command.  The default type may be overridden on a per-command basis
                         in the _sudoers_ file or via command  line  options.   This  option  is  only
                         available when **sudo **is built with SELinux support.

       **Strings that can be used in a boolean context**:

       admin_flag    The  _admin_flag_  option  specifies the path to a file that is created the first
                     time a user that is a member of the _sudo_  or  _admin_  groups  runs  **sudo**.   Only
                     available  if  **sudo **is configured with the **--enable-admin-flag **option.  The de‐
                     fault value is _~/.sudo_as_admin_successful_.

       env_file      The _env_file_ option specifies the fully qualified path  to  a  file  containing
                     variables  to  be  set in the environment of the program being run.  Entries in
                     this  file  should  either  be  of  the  form   ‘VARIABLE=value’   or   ‘export
                     VARIABLE=value’.   The  value  may  optionally  be enclosed in single or double
                     quotes.  Variables in this file are only added if the variable does not already
                     exist in the environment.  This file is considered to be part of  the  security
                     policy,  its  contents  are  not subject to other **sudo **environment restrictions
                     such as _env_keep_ and _env_check_.

       exempt_group  Users in this group are exempt from password and PATH requirements.  The  group
                     name specified should not include a ‘%’ prefix.  This is not set by default.

       fdexec        Determines  whether  **sudo **will execute a command by its path or by an open file
                     descriptor.  It has the following possible values:

                     always  Always execute by file descriptor.

                     never   Never execute by file descriptor.

                     digest_only
                             Only execute by file descriptor if the command has an associated digest
                             in the _sudoers_ file.

                     The default value is _digest_only_.  This avoids a time of check versus  time  of
                     use  race  condition when the command is located in a directory writable by the
                     invoking user.

                     _fdexec_ will change the first element of the argument vector for scripts ($0  in
                     the  shell) due to the way the kernel runs script interpreters.  Instead of be‐
                     ing a normal path, it will refer to a file descriptor.  For example,  _/dev/fd/4_
                     on  Solaris  and  _/proc/self/fd/4_  on  Linux.   A  workaround  is  to  use  the
                     SUDO_COMMAND environment variable instead.

                     The _fdexec_ setting is only used when the command is matched by path  name.   It
                     has no effect if the command is matched by the built-in **ALL **alias.

                     This  setting  is only supported by version 1.8.20 or higher.  If the operating
                     system does not support the [_fexecve_(2)](https://www.chedong.com/phpMan.php/man/fexecve/2/markdown) system call, this setting has no effect.

       group_plugin  A string containing a **sudoers **group plugin with optional arguments.  The string
                     should consist of the plugin path, either fully-qualified or  relative  to  the
                     _/usr/libexec/sudo_ directory, followed by any configuration arguments the plugin
                     requires.   These arguments (if any) will be passed to the plugin's initializa‐
                     tion function.  If arguments are present, the string must be enclosed in double
                     quotes ("").

                     On 64-bit systems, if the plugin is present but cannot be loaded, **sudoers  **will
                     look  for a 64-bit version and, if it exists, load that as a fallback.  The ex‐
                     act rules for this vary by system.  On Solaris, if the plugin is  stored  in  a
                     directory  ending  in  “lib”,  **sudoers **will create a fallback path by appending
                     “/64”    to    the    directory    name;    _/usr/lib/group_plugin.so_    becomes
                     _/usr/lib/64/group_plugin.so_.   On  Linux,  a  directory ending in “lib” will be
                     transformed to “lib64” as the fallback path;  _/usr/lib/group_plugin.so_  becomes
                     _/usr/lib64/group_plugin.so_.   On all other systems, the fallback path is gener‐
                     ated by adding a  “64”  before  the  file  extension;  _group_plugin.so_  becomes
                     _group_plugin64.so_.

                     On  AIX systems, the plugin may be either a shared object ending in ‘.so’ or an
                     archive file containing a shared object ending in ‘.a’ with  the  name  of  the
                     shared object in parentheses at the end.

                     For more information see “GROUP PROVIDER PLUGINS”.

       lecture       This  option controls when a short lecture will be printed along with the pass‐
                     word prompt.  It has the following possible values:

                     always  Always lecture the user.

                     never   Never lecture the user.

                     once    Only lecture the user the first time they run **sudo**.

                     If no value is specified, a value of _once_ is implied.  Negating the option  re‐
                     sults in a value of _never_ being used.  The default value is _never_.

       lecture_file  Path  to a file containing an alternate **sudo **lecture that will be used in place
                     of the standard lecture if the named file exists.   By  default,  **sudo  **uses  a
                     built-in lecture.

       listpw        This  option  controls  when  a password will be required when a user runs **sudo**
                     with the **-l **option.  It has the following possible values:

                     all   All the user's _sudoers_ file entries for the current host  must  have  the
                           NOPASSWD flag set to avoid entering a password.

                     always
                           The user must always enter a password to use the **-l **option.

                     any   At least one of the user's _sudoers_ file entries for the current host must
                           have the NOPASSWD flag set to avoid entering a password.

                     never
                           The user need never enter a password to use the **-l **option.

                     If  no  value is specified, a value of _any_ is implied.  Negating the option re‐
                     sults in a value of _never_ being used.  The default value is _any_.

       log_format    The event log format.  Supported log formats are:

                     json  Logs in JSON format.  JSON log entries contain the full user  details  as
                           well  as  the  execution  environment if the command was allowed.  Due to
                           limitations of the protocol, JSON events sent via  _syslog_  may  be  trun‐
                           cated.

                     sudo  Traditional sudo-style logs, see “EVENT LOGGING” for a description of the
                           log file format.

                     This  setting  affects logs sent via [_syslog_(3)](https://www.chedong.com/phpMan.php/man/syslog/3/markdown) as well as the file specified by
                     the _logfile_ setting, if any.  The default value is _sudo_.

       logfile       Path to the **sudo **log file (not the syslog log file).  Setting a path  turns  on
                     logging  to  a  file; negating this option turns it off.  By default, **sudo **logs
                     via syslog.

       mailerflags   Flags to use when invoking mailer.  Defaults to **-t**.

       mailerpath    Path to mail program used to send warning mail (negate  to  prevent  **sudo  **from
                     sending mail).  Defaults to the path to sendmail found at configure time.

       mailfrom      Address to use for the “from” address when sending warning and error mail.  The
                     address should be enclosed in double quotes ("") to protect against **sudo **inter‐
                     preting the ‘@’ sign.  Defaults to the name of the user running **sudo**.

       mailto        Address  to send warning and error mail to (negate to prevent **sudo **from sending
                     mail).  The address should be enclosed in double quotes ("") to protect against
                     **sudo **interpreting the ‘@’ sign.  Defaults to root.

       rlimit_as     The maximum size to which the process's address space may grow (in  bytes),  if
                     supported by the operating system.  See “Resource limits” for more information.

       rlimit_core   The  largest size core dump file that may be created (in bytes).  See “Resource
                     limits” for more information.  Defaults to 0 (no core dump created).

       rlimit_cpu    The maximum amount of CPU time that the process  may  use  (in  seconds).   See
                     “Resource limits” for more information.

       rlimit_data   The maximum size of the data segment for the process (in bytes).  See “Resource
                     limits” for more information.

       rlimit_fsize  The  largest  size  file that the process may create (in bytes).  See “Resource
                     limits” for more information.

       rlimit_locks  The maximum number of locks that the process may establish, if supported by the
                     operating system.  See “Resource limits” for more information.

       rlimit_memlock
                     The maximum size that the process may lock in memory (in bytes),  if  supported
                     by the operating system.  See “Resource limits” for more information.

       rlimit_nofile
                     The  maximum  number  of  files  that the process may have open.  See “Resource
                     limits” for more information.

       rlimit_nproc  The maximum number of processes that the  user  may  run  simultaneously.   See
                     “Resource limits” for more information.

       rlimit_rss    The  maximum size to which the process's resident set size may grow (in bytes).
                     See “Resource limits” for more information.

       rlimit_stack  The maximum size to which  the  process's  stack  may  grow  (in  bytes).   See
                     “Resource limits” for more information.

       restricted_env_file
                     The  _restricted_env_file_  option  specifies  the fully qualified path to a file
                     containing variables to be set in the environment of  the  program  being  run.
                     Entries  in  this file should either be of the form ‘VARIABLE=value’ or ‘export
                     VARIABLE=value’.  The value may optionally be  enclosed  in  single  or  double
                     quotes.  Variables in this file are only added if the variable does not already
                     exist in the environment.  Unlike _env_file_, the file's contents are not trusted
                     and  are  processed in a manner similar to that of the invoking user's environ‐
                     ment.  If _env_reset_ is enabled, variables in the file will  only  be  added  if
                     they  are  matched  by  either the _env_check_ or _env_keep_ list.  If _env_reset_ is
                     disabled, variables in the file are added as long as they are  not  matched  by
                     the  _env_delete_  list.  In either case, the contents of _restricted_env_file_ are
                     processed before the contents of _env_file_.

       runchroot     If set, **sudo **will use this value for the root directory when running a command.
                     The special value “*” will allow the user to specify  the  root  directory  via
                     **sudo**'s **-R **option.  See the “Chroot_Spec” section for more details.

                     It  is only possible to use _runchroot_ as a command-specific Defaults setting if
                     the command exists with the same path both inside and outside the chroot  jail.
                     This  restriction  does  not apply to global, host, or user-based Defaults set‐
                     tings or to a _Cmnd_Spec_ that includes a _Chroot_Spec_.

                     This setting is only supported by version 1.9.3 or higher.

       runcwd        If set, **sudo **will use this value for the working directory when running a  com‐
                     mand.   The special value “*” will allow the user to specify the working direc‐
                     tory via **sudo**'s **-D **option.  See the “Chdir_Spec” section for more details.

                     This setting is only supported by version 1.9.3 or higher.

       secure_path   If set, **sudo **will use this value in place of the user's PATH environment  vari‐
                     able.   This  option  can  be used to reset the PATH to a known good value that
                     contains directories for system administrator commands such as _/usr/sbin_.

                     Users in the group specified by the _exempt_group_ option  are  not  affected  by
                     _secure_path_.  This option is not set by default.

       syslog        Syslog  facility  if syslog is being used for logging (negate to disable syslog
                     logging).  Defaults to authpriv.

                     The following syslog facilities are supported: **authpriv **(if  your  OS  supports
                     it),  **auth**,  **daemon**,  **user**,  **local0**,  **local1**,  **local2**,  **local3**, **local4**, **local5**,
                     **local6**, and **local7**.

       syslog_badpri
                     Syslog priority to use when the user is not allowed to run a  command  or  when
                     authentication is unsuccessful.  Defaults to alert.

                     The  following syslog priorities are supported: **alert**, **crit**, **debug**, **emerg**, **err**,
                     **info**, **notice**, **warning**, and **none**.  Negating the option or setting it to a  value
                     of **none **will disable logging of unsuccessful commands.

       syslog_goodpri
                     Syslog  priority to use when the user is allowed to run a command and authenti‐
                     cation is successful.  Defaults to notice.

                     See _syslog_badpri_ for the list of supported syslog  priorities.   Negating  the
                     option or setting it to a value of **none **will disable logging of successful com‐
                     mands.

       verifypw      This  option  controls  when  a password will be required when a user runs **sudo**
                     with the **-v **option.  It has the following possible values:

                     all     All the user's _sudoers_ file entries for the current host must have  the
                             NOPASSWD flag set to avoid entering a password.

                     always  The user must always enter a password to use the **-v **option.

                     any     At  least  one  of the user's _sudoers_ file entries for the current host
                             must have the NOPASSWD flag set to avoid entering a password.

                     never   The user need never enter a password to use the **-v **option.

                     If no value is specified, a value of _all_ is implied.  Negating the  option  re‐
                     sults in a value of _never_ being used.  The default value is _all_.

       **Lists that can be used in a boolean context**:

       env_check         Environment variables to be removed from the user's environment unless they
                         are  considered “safe”.  For all variables except TZ, “safe” means that the
                         variable's value does not contain any ‘%’ or ‘/’ characters.  This  can  be
                         used to guard against printf-style format vulnerabilities in poorly-written
                         programs.  The TZ variable is considered unsafe if any of the following are
                         true:

                         **•  **It  consists  of a fully-qualified path name, optionally prefixed with a
                            colon (‘:’), that does not match the location of the _zoneinfo_ directory.

                         **•  **It contains a _.._ path element.

                         **•  **It contains white space or non-printable characters.

                         **•  **It is longer than the value of PATH_MAX.

                         The argument may be a double-quoted, space-separated list or a single value
                         without double-quotes.  The list can be replaced, added to,  deleted  from,
                         or  disabled  by using the ‘=’, ‘+=’, ‘-=’, and ‘!’ operators respectively.
                         Regardless of whether the _env_reset_ option is enabled  or  disabled,  vari‐
                         ables  specified  by _env_check_ will be preserved in the environment if they
                         pass the aforementioned check.  The global list of environment variables to
                         check is displayed when **sudo **is run by **root **with the **-V **option.

       env_delete        Environment variables to be removed from the user's  environment  when  the
                         _env_reset_  option  is  not in effect.  The argument may be a double-quoted,
                         space-separated list or a single value without double-quotes.  The list can
                         be replaced, added to, deleted from, or disabled by using  the  ‘=’,  ‘+=’,
                         ‘-=’, and ‘!’ operators respectively.  The global list of environment vari‐
                         ables  to  remove is displayed when **sudo **is run by **root **with the **-V **option.
                         Many operating systems will remove potentially dangerous variables from the
                         environment of any set-user-ID process (such as **sudo**).

       env_keep          Environment variables to be preserved in the user's  environment  when  the
                         _env_reset_  option  is in effect.  This allows fine-grained control over the
                         environment **sudo**-spawned processes will receive.  The  argument  may  be  a
                         double-quoted,  space-separated  list  or  a  single  value without double-
                         quotes.  The list can be replaced, added to, deleted from, or  disabled  by
                         using the ‘=’, ‘+=’, ‘-=’, and ‘!’ operators respectively.  The global list
                         of  variables to keep is displayed when **sudo **is run by **root **with the **-V **op‐
                         tion.

                         Preserving the HOME environment variable has  security  implications  since
                         many  programs  use  it  when  searching  for  configuration or data files.
                         Adding HOME to _env_keep_ may enable a user to run unrestricted commands  via
                         **sudo  **and  is  strongly discouraged.  Users wishing to edit files with **sudo**
                         should run **sudoedit **(or **sudo -e**) to get their accustomed editor  configura‐
                         tion instead of invoking the editor directly.

       log_servers       A  list of one or more servers to use for remote event and I/O log storage,
                         separated by white space.  Log servers must be running **sudo_logsrvd **or  an‐
                         other    service    that    implements    the    protocol    described   by
                         [_sudo_logsrv.proto_(5)](https://www.chedong.com/phpMan.php/man/sudologsrv.proto/5/markdown).

                         Server addresses should be of the form “host[:port][(tls)]”.  The host por‐
                         tion may be a host name, an IPv4 address, or  an  IPv6  address  in  square
                         brackets.

                         If  the  optional  _tls_ flag is present, the connection will be secured with
                         Transport Layer Security (TLS) version 1.2 or 1.3.  Versions of  TLS  prior
                         to 1.2 are not supported.

                         If a port is specified, it may either be a port number or a well-known ser‐
                         vice  name  as  defined by the system service name database.  If no port is
                         specified, port 30343 will be used for plaintext connections and port 30344
                         will be used for TLS connections.

                         When _log_servers_ is set, event log data will be logged  both  locally  (see
                         the  _syslog_  and  _log_file_  settings) as well as remotely, but I/O log data
                         will only be logged remotely.  If multiple hosts are specified,  they  will
                         be  attempted  in reverse order.  If no log servers are available, the user
                         will not be able to run a command  unless  either  the  _ignore_iolog_errors_
                         flag  (I/O logging enabled) or the _ignore_log_errors_ flag (I/O logging dis‐
                         abled) is set.  Likewise, if the connection to the  log  server  is  inter‐
                         rupted  while  **sudo  **is  running, the command will be terminated unless the
                         _ignore_iolog_errors_ flag (I/O logging  enabled)  or  the  _ignore_log_errors_
                         flag (I/O logging disabled) is set.

                         This setting is only supported by version 1.9.0 or higher.

       passprompt_regex  A list of POSIX extended regular expressions used to match password prompts
                         in  the terminal output.  As an extension, if the regular expression begins
                         with “(?i)”, it will be matched in a case-insensitive manner.  Each regular
                         expression is limited to 1024 characters.  This option is  only  used  when
                         _log_passwords_ has been disabled.  The default value is “[Pp]assword[: ]*”

                         This setting is only supported by version 1.9.10 or higher.

## GROUP PROVIDER PLUGINS
       The  **sudoers  **plugin  supports its own plugin interface to allow non-Unix group lookups which
       can query a group source other than the standard Unix group database.  This can  be  used  to
       implement support for the _nonunix_group_ syntax described earlier.

       Group  provider  plugins  are  specified  via  the  _group_plugin_  setting.   The  argument to
       _group_plugin_ should consist of the plugin path, either fully-qualified  or  relative  to  the
       _/usr/libexec/sudo_  directory,  followed  by  any  configuration  options the plugin requires.
       These options (if specified) will be passed to the plugin's initialization function.  If  op‐
       tions are present, the string must be enclosed in double quotes ("").

       The following group provider plugins are installed by default:

       group_file
             The _group_file_ plugin supports an alternate group file that uses the same syntax as the
             _/etc/group_  file.   The  path to the group file should be specified as an option to the
             plugin.  For example, if the group file to be used is _/etc/sudo-group_:

             Defaults group_plugin="group_file.so /etc/sudo-group"

       system_group
             The _system_group_ plugin supports group lookups via the  standard  C  library  functions
             [_getgrnam_(3)](https://www.chedong.com/phpMan.php/man/getgrnam/3/markdown)  and  [_getgrid_(3)](https://www.chedong.com/phpMan.php/man/getgrid/3/markdown).   This plugin can be used in instances where the user be‐
             longs to groups not present in the user's supplemental group vector.  This plugin takes
             no options:

             Defaults group_plugin=system_group.so

       The group provider plugin API is described in detail in [_sudo_plugin_(5)](https://www.chedong.com/phpMan.php/man/sudoplugin/5/markdown).

## EVENT LOGGING
       **sudoers **can log events in either JSON or _sudo_ format, this section  describes  the  _sudo_  log
       format.  Depending on _sudoers_ configuration, **sudoers **can log events via [_syslog_(3)](https://www.chedong.com/phpMan.php/man/syslog/3/markdown), to a local
       log file, or both.  The log format is almost identical in both cases.  Any control characters
       present  in the log data are formatted in octal with a leading ‘#’ character.  For example, a
       horizontal tab is stored as ‘#011’ and an embedded carriage return is stored as  ‘#015’.   In
       addition,  space characters in the command path are stored as ‘#040’.  Command line arguments
       that contain spaces are enclosed in single quotes ('').  This makes it  possible  to  distin‐
       guish  multiple  command line arguments from a single argument that contains spaces.  Literal
       single quotes and backslash characters (‘\’) in command line arguments  are  escaped  with  a
       backslash.

### Accepted command log entries
       Commands  that sudo runs are logged using the following format (split into multiple lines for
       readability):

           date hostname progname: username : TTY=ttyname ; CHROOT=chroot ; \
               PWD=cwd ; USER=runasuser ; GROUP=runasgroup ; TSID=logid ; \
               ENV=env_vars COMMAND=command

       Where the fields are as follows:

       date          The date the command was run.  Typically, this  is  in  the  format  “MMM,  DD,
                     HH:MM:SS”.   If  logging via [_syslog_(3)](https://www.chedong.com/phpMan.php/man/syslog/3/markdown), the actual date format is controlled by
                     the syslog daemon.  If logging to a file and the _log_year_  option  is  enabled,
                     the date will also include the year.

       hostname      The  name of the host **sudo **was run on.  This field is only present when logging
                     via [_syslog_(3)](https://www.chedong.com/phpMan.php/man/syslog/3/markdown).

       progname      The name of the program, usually _sudo_ or _sudoedit_.  This field is only  present
                     when logging via [_syslog_(3)](https://www.chedong.com/phpMan.php/man/syslog/3/markdown).

       username      The login name of the user who ran **sudo**.

       ttyname       The  short name of the terminal (e.g., “console”, “tty01”, or “pts/0”) **sudo **was
                     run on, or “unknown” if there was no terminal present.

       chroot        The root directory that the command was run in, if one was specified.

       cwd           The current working directory that **sudo **was run in.

       runasuser     The user the command was run as.

       runasgroup    The group the command was run as if one was specified on the command line.

       logid         An I/O log identifier that can be used to replay the command's output.  This is
                     only present when the _log_input_ or _log_output_ option is enabled.

       env_vars      A list of environment variables specified on the command line, if specified.

       command       The actual command that was executed, including any command line arguments.

       Messages are logged using the locale specified by _sudoers_locale_, which defaults to  the  ‘C’
       locale.

### Denied command log entries
       If the user is not allowed to run the command, the reason for the denial will follow the user
       name.  Possible reasons include:

       user NOT in sudoers
         The user is not listed in the _sudoers_ file.

       user NOT authorized on host
         The user is listed in the _sudoers_ file but is not allowed to run commands on the host.

       command not allowed
         The  user  is  listed  in the _sudoers_ file for the host but they are not allowed to run the
         specified command.

       3 incorrect password attempts
         The user failed to enter their password after 3 tries.  The actual  number  of  tries  will
         vary based on the number of failed attempts and the value of the _passwd_tries_ option.

       a password is required
         The **-n **option was specified but a password was required.

       sorry, you are not allowed to set the following environment variables
         The  user  specified  environment  variables  on  the command line that were not allowed by
         _sudoers_.

### Error log entries
       If an error occurs, **sudoers **will log a message and, in most cases, send a message to the  ad‐
       ministrator via email.  Possible errors include:

       parse error in /etc/sudoers near line N
         **sudoers  **encountered  an  error when parsing the specified file.  In some cases, the actual
         error may be one line above or below the line number listed, depending on the type  of  er‐
         ror.

       problem with defaults entries
         The  _sudoers_  file  contains  one or more unknown Defaults settings.  This does not prevent
         **sudo **from running, but the _sudoers_ file should be checked using **visudo**.

       timestamp owner (username): No such user
         The time stamp directory owner, as specified by the _timestampowner_ setting,  could  not  be
         found in the password database.

       unable to open/read /etc/sudoers
         The _sudoers_ file could not be opened for reading.  This can happen when the _sudoers_ file is
         located  on  a  remote  file  system  that  maps user-ID 0 to a different value.  Normally,
         **sudoers **tries to open the _sudoers_ file using group permissions to avoid this problem.  Con‐
         sider  either  changing  the  ownership  of  _/etc/sudoers_  or  adding  an   argument   like
         “sudoers_uid=N”  (where  ‘N’  is  the user-ID that owns the _sudoers_ file) to the end of the
         **sudoers _**Plugin_ line in the [_sudo.conf_(5)](https://www.chedong.com/phpMan.php/man/sudo.conf/5/markdown) file.

       unable to open /etc/sudoers
         The _/etc/sudoers_ file is missing.

       /etc/sudoers is not a regular file
         The _/etc/sudoers_ file exists but is not a regular file or symbolic link.

       /etc/sudoers is owned by uid N, should be 0
         The _sudoers_ file has the wrong owner.  If you wish to change the _sudoers_  file  owner,  add
         “sudoers_uid=N” (where ‘N’ is the user-ID that owns the _sudoers_ file) to the **sudoers _**Plugin_
         line in the [_sudo.conf_(5)](https://www.chedong.com/phpMan.php/man/sudo.conf/5/markdown) file.

       /etc/sudoers is world writable
         The  permissions on the _sudoers_ file allow all users to write to it.  The _sudoers_ file must
         not be world-writable, the default file mode is 0440 (readable by owner and group, writable
         by none).  The default mode may be changed via the “sudoers_mode”  option  to  the  **sudoers**
         _Plugin_ line in the [_sudo.conf_(5)](https://www.chedong.com/phpMan.php/man/sudo.conf/5/markdown) file.

       /etc/sudoers is owned by gid N, should be 1
         The  _sudoers_  file  has  the wrong group ownership.  If you wish to change the _sudoers_ file
         group ownership, add “sudoers_gid=N” (where ‘N’ is the group-ID that owns the _sudoers_ file)
         to the **sudoers _**Plugin_ line in the [_sudo.conf_(5)](https://www.chedong.com/phpMan.php/man/sudo.conf/5/markdown) file.

       unable to open /run/sudo/ts/user-ID
         **sudoers **was unable to read or create the user's time stamp  file.   This  can  happen  when
         _timestampowner_ is set to a user other than **root **and the mode on _/run/sudo_ is not searchable
         by group or other.  The default mode for _/run/sudo_ is 0711.

       unable to write to /run/sudo/ts/user-ID
         **sudoers **was unable to write to the user's time stamp file.

       /run/sudo/ts is owned by uid X, should be Y
         The time stamp directory is owned by a user other than _timestampowner_.  This can occur when
         the value of _timestampowner_ has been changed.  **sudoers **will ignore the time stamp directory
         until the owner is corrected.

       /run/sudo/ts is group writable
         The  time  stamp directory is group-writable; it should be writable only by _timestampowner_.
         The default mode for the time stamp directory is 0700.  **sudoers **will ignore the time  stamp
         directory until the mode is corrected.

### Notes on logging via syslog
       By default, **sudoers **logs messages via [_syslog_(3)](https://www.chedong.com/phpMan.php/man/syslog/3/markdown).  The _date_, _hostname_, and _progname_ fields are
       added by the system's [_syslog_(3)](https://www.chedong.com/phpMan.php/man/syslog/3/markdown) function, not **sudoers **itself.  As such, they may vary in for‐
       mat on different systems.

       The  maximum size of syslog messages varies from system to system.  The _syslog_maxlen_ setting
       can be used to change the maximum syslog message size from the default value  of  980  bytes.
       For more information, see the description of _syslog_maxlen_.

### Notes on logging to a file
       If  the _logfile_ option is set, **sudoers **will log to a local file, such as _/var/log/sudo_.  When
       logging to a file, **sudoers **uses a format similar to [_syslog_(3)](https://www.chedong.com/phpMan.php/man/syslog/3/markdown), with a few  important  differ‐
       ences:

       1.   The _progname_ field is not present.

       2.   The _hostname_ is only logged if the _log_host_ option is enabled.

       3.   The date does not include the year unless the _log_year_ option is enabled.

       4.   Lines  that  are  longer than _loglinelen_ characters (80 by default) are word-wrapped and
            continued on the next line with a four character indent.  This makes entries  easier  to
            read for a human being, but makes it more difficult to use [_grep_(1)](https://www.chedong.com/phpMan.php/man/grep/1/markdown) on the log files.  If
            the _loglinelen_ option is set to 0 (or negated with a ‘!’), word wrap will be disabled.

## I/O LOGGING
       When  I/O  logging  is enabled, **sudo **will runs the command in a pseudo-terminal, logging user
       input and/or output, depending on which **sudoers **flags are enabled.  There are  five  distinct
       types of I/O that can be logged, each with a corresponding **sudoers **flag.

### Type               Flag          Description
       terminal input     log_ttyin     keystrokes entered by the user
       terminal output    log_ttyout    command output displayed to the screen
       standard input     log_stdin     input from a pipe or a file
       standard output    log_stdout    output to a pipe or a file
       standard error     log_stderr    output to a pipe or a file

       In  addition  to  flags described the above, the _log_input_ flag and LOG_INPUT command tag set
       both _log_ttyin_ and _log_stdin_.  The _log_output_ flag and LOG_OUTPUT command tag set _log_ttyout_,
       _log_stdout_, and _log_stderr_.

       To capture terminal input and output, **sudo **run the command in a pseudo-terminal, logging  the
       input  and  output before passing it on to the user.  To capture the standard input, standard
       output or standard error, **sudo **uses a pipe to interpose itself between the  input  or  output
       stream, logging the I/O before passing it to the other end of the pipe.

       I/O can be logged either to the local machine or to a remote log server.  For local logs, I/O
       is  logged  to  the directory specified by the _iolog_dir_ option (_/var/log/sudo-io_ by default)
       using a unique session ID that is included in the **sudo **log line, prefixed with ‘TSID=’.   The
       _iolog_file_  option may be used to control the format of the session ID.  For remote logs, the
       _log_servers_ setting is used to specify one or more log servers running  **sudo_logsrvd  **or  an‐
       other server that implements the protocol described by [_sudo_logsrv.proto_(5)](https://www.chedong.com/phpMan.php/man/sudologsrv.proto/5/markdown).

### I/O logging pitfals
       When logging standard input, anything sent to the standard input will be consumed, regardless
       of  whether or not the command run via **sudo **is actively reading the standard input.  This may
       have unexpected results when using **sudo **in a shell script that expects to process  the  stan‐
       dard input.  For example, given the following shell script:

           #!/bin/sh
           sudo echo testing
           echo done

       It will behave as expected when the script is passed to the shell as a an argument:

           $ sh test.sh
           testing
           done

       However,  if the script is passed to the shell on the standard input, the ‘sudo echo testing’
       command will consume the rest of the script.  This means that the ‘echo  done’  statement  is
       never executed.

           $ sh -s < test.sh
           testing

       There are several ways to work around this problem:

       1.   Redirect the standard input from _/dev/null_ when running a command via **sudo **that does not
            need to read the standard input.

                sudo echo testing < /dev/null

       2.   Pass the script to the shell by path name instead of via the standard input.

                sh test.sh

       3.   Disable  logging  the  standard input for commands that do not need to read the standard
            input.

                Defaults!/bin/echo !log_stdin

       Depending on the command, it may not be desirable to log the standard input or standard  out‐
       put.   For example, I/O logging of commands that send or receive large amount of data via the
       standard output or standard input such as [_rsync_(1)](https://www.chedong.com/phpMan.php/man/rsync/1/markdown) and [_tar_(1)](https://www.chedong.com/phpMan.php/man/tar/1/markdown) could fill up the log file sys‐
       tem with superfluous data.  It is possible to disable logging of the standard input and stan‐
       dard output for such commands as follows:

           Cmnd_Alias COPY_CMDS = /usr/bin/tar, /usr/bin/cpio, /usr/bin/rsync

           # Log input and output but omit stdin and stdout when copying files.
           Defaults log_input, log_output
           Defaults!COPY_CMDS !log_stdin, !log_stdout

       However, be aware that using the _log_input_ flag or the LOG_INPUT command tag will also enable
       _log_stdin_.  Likewise, the _log_ouput_ flag or the LOG_OUTPUT command tag will enable _log_stdout_
       and _log_stderr._ Careful ordering of rules may be necessary to achieve the  results  that  you
       expect.

### I/O log format
       For  both local and remote I/O logs, each log is stored in a separate directory that contains
       the following files:

       _log_       A text file containing information about the command.  The first line  consists  of
                 the following colon-delimited fields: the time the command was run, the name of the
                 user  who  ran **sudo**, the name of the target user, the name of the target group (op‐
                 tional), the terminal that **sudo **was run from, and the number of lines  and  columns
                 of the terminal.  The second and third lines contain the working directory the com‐
                 mand  was  run  from  and  the  path  name of the command itself (with arguments if
                 present).

       _log.json_  A JSON-formatted file containing information about the command.  This is similar to
                 the _log_ file but contains additional information and  is  easily  extensible.   The
                 _log.json_ file will be used by [_sudoreplay_(8)](https://www.chedong.com/phpMan.php/man/sudoreplay/8/markdown) in preference to the _log_ file if it ex‐
                 ists.  The file may contain the following elements:

                 timestamp
                       A  JSON  object containing time the command was run.  It consists of two val‐
                       ues, _seconds_ and _nanoseconds_.

                 columns
                       The number of columns of the terminal the command ran on, or zero if no  ter‐
                       minal was present.

                 command
                       The fully-qualified path of the command that was run.

                 lines
                       The  number of lines of the terminal the command ran on, or zero if no termi‐
                       nal was present.

                 runargv
                       A JSON array representing the command's argument  vector  as  passed  to  the
                       [_execve_(2)](https://www.chedong.com/phpMan.php/man/execve/2/markdown) system call.

                 runenv
                       A  JSON  array  representing  the  command's  environment  as  passed  to the
                       [_execve_(2)](https://www.chedong.com/phpMan.php/man/execve/2/markdown) system call.

                 rungid
                       The group ID the command ran as.  This element is only present when the  user
                       specifies a group on the command line.

                 rungroup
                       The  name of the group the command ran as.  This element is only present when
                       the user specifies a group on the command line.

                 runuid
                       The user ID the command ran as.

                 runuser
                       The name of the user the command ran as.

                 submitcwd
                       The current working directory at the time **sudo **was run.

                 submithost
                       The name of the host the command was run on.

                 submituser
                       The name of the user who ran the command via **sudo**.

                 ttyname
                       The path name of the terminal the user invoked **sudo **from.  If the command was
                       run in a pseudo-terminal, _ttyname_ will be different  from  the  terminal  the
                       command actually ran in.

       _timing_    Timing  information  used to replay the session.  Each line consists of the I/O log
                 entry type and amount of time since the last entry, followed by type-specific data.
                 The I/O log entry types and their corresponding type-specific data are:

                 0     standard input, number of bytes in the entry
                 1     standard output, number of bytes in the entry
                 2     standard error, number of bytes in the entry
                 3     terminal input, number of bytes in the entry
                 4     terminal output, number of bytes in the entry
                 5     window change, new number lines and columns
                 6     bug compatibility for **sudo **1.8.7 terminal output
                 7     command suspend or resume, signal received

       _ttyin_     Raw input from the user's terminal, exactly as it was received.  This file is  only
                 present  if the _log_input_ or _log_ttyin_ flags are set and **sudo **was run from a termi‐
                 nal.  No post-processing is performed.  For manual viewing, you may wish to convert
                 carriage return characters in the log to line feeds.  For example: ‘gunzip -c ttyin
                 | tr "\r" "\n"’

       _stdin_     The standard input when no terminal is present, or input redirected from a pipe  or
                 file.   This  file  is only present if the _log_input_ or _log_stdin_ flags are set and
                 the standard input is not connected to a terminal.

       _ttyout_    Output from the pseudo-terminal (what the command writes to the screen).  Terminal-
                 specific post-processing is performed before the data is logged.  This means  that,
                 for  example,  line  feeds are usually converted to line feed/carriage return pairs
                 and tabs may be expanded to spaces.  This file is only present if the _log_output_ or
                 _log_ttyout_ flags are set and **sudo **was run from a terminal.

       _stdout_    The standard output when no terminal is present, or output redirected to a pipe  or
                 file.   This file is only present if the _log_output_ or _log_stdout_ flags are set and
                 the standard output is not connected to a terminal.

       _stderr_    The standard error when no terminal is present, or output redirected to a  pipe  or
                 file.   This file is only present if the _log_output_ or _log_stderr_ flags are set and
                 the standard error is not connected to a terminal.

       All files other than _log_ are compressed in gzip format unless the _compress_io_ flag  has  been
       disabled.  Due to buffering, it is not normally possible to display the I/O logs in real-time
       as  the program is executing.  The I/O log data will not be complete until the program run by
       **sudo **has exited or has been terminated by a signal.  The _iolog_flush_ flag can be used to dis‐
       able buffering, in which case I/O log data is written to disk as soon  as  it  is  available.
       The output portion of an I/O log file can be viewed with the [_sudoreplay_(8)](https://www.chedong.com/phpMan.php/man/sudoreplay/8/markdown) utility, which can
       also be used to list or search the available logs.

       User  input  may contain sensitive information such as passwords (even if they are not echoed
       to the screen), which will be stored in the log file unencrypted.  In most cases, logging the
       command output via _log_output_ or LOG_OUTPUT is all that is  required.   When  logging  input,
       consider disabling the _log_passwords_ flag.

       Since  each  session's  I/O logs are stored in a separate directory, traditional log rotation
       utilities cannot be used to limit the number of I/O logs.  The simplest way to limit the num‐
       ber of I/O is by setting the _maxseq_ option to the maximum number of logs you wish  to  store.
       Once  the  I/O  log sequence number reaches _maxseq_, it will be reset to zero and **sudoers **will
       truncate and re-use any existing I/O logs.

## FILES
       _/etc/sudo.conf_            Sudo front-end configuration

       _/etc/sudoers_              List of who can run what

       _/etc/group_                Local groups file

       _/etc/netgroup_             List of network groups

       _/var/log/sudo-io_          I/O log files

       _/run/sudo/ts_              Directory containing time stamps for the **sudoers **security policy

       _/var/lib/sudo/lectured_    Directory containing lecture status files for the **sudoers  **security
                                 policy

       _/etc/environment_          Initial environment for **-i **mode on AIX and Linux systems

## EXAMPLES
       Below  are  example  _sudoers_  file  entries.   Admittedly, some of these are a bit contrived.
       First, we allow a few environment variables to pass and then define our _aliases_:

       # Run X applications through sudo; HOME is used to find the
       # .Xauthority file.  Other programs use HOME to locate configuration
       # files and this may lead to privilege escalation!
       Defaults env_keep += "DISPLAY HOME"

       # User alias specification
       User_Alias      FULLTIMERS = millert, mikef, dowdy
       User_Alias      PARTTIMERS = bostley, jwfox, crawl
       User_Alias      WEBADMIN = will, wendy, wim

       # Runas alias specification
       Runas_Alias     OP = root, operator
       Runas_Alias     DB = oracle, sybase
       Runas_Alias     ADMINGRP = adm, oper

       # Host alias specification
       Host_Alias      SPARC = bigtime, eclipse, moet, anchor :\
                       SGI = grolsch, dandelion, black :\
                       ALPHA = widget, thalamus, foobar :\
                       HPPA = boa, nag, python
       Host_Alias      CUNETS = 128.138.0.0/255.255.0.0
       Host_Alias      CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0
       Host_Alias      SERVERS = primary, mail, www, ns
       Host_Alias      CDROM = orion, perseus, hercules

       # Cmnd alias specification
       Cmnd_Alias      DUMPS = /usr/bin/mt, /usr/sbin/dump, /usr/sbin/rdump,\
                               /usr/sbin/restore, /usr/sbin/rrestore,\
                               sha224:0GomF8mNN3wlDt1HD9XldjJ3SNgpFdbjO1+NsQ== \
                               /home/operator/bin/start_backups
       Cmnd_Alias      KILL = /usr/bin/kill
       Cmnd_Alias      PRINTING = /usr/sbin/lpc, /usr/bin/lprm
       Cmnd_Alias      SHUTDOWN = /usr/sbin/shutdown
       Cmnd_Alias      HALT = /usr/sbin/halt
       Cmnd_Alias      REBOOT = /usr/sbin/reboot
       Cmnd_Alias      SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh,\
                                /usr/local/bin/tcsh, /usr/bin/rsh,\
                                /usr/local/bin/zsh
       Cmnd_Alias      SU = /usr/bin/su
       Cmnd_Alias      PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less

       Here we override some of the compiled in default values.  We want **sudo **to log  via  [_syslog_(3)](https://www.chedong.com/phpMan.php/man/syslog/3/markdown)
       using  the  _auth_ facility in all cases and for commands to be run with the target user's home
       directory as the working directory.  We don't want to subject the full time staff to the **sudo**
       lecture and we want to allow them to run commands in a [_chroot_(2)](https://www.chedong.com/phpMan.php/man/chroot/2/markdown) “sandbox” via the **-R **option.
       User **millert **need not provide a password and we don't want to reset the LOGNAME or USER envi‐
       ronment variables when running commands as  **root**.   Additionally,  on  the  machines  in  the
       SERVERS  _Host_Alias_,  we  keep  an additional local log file and make sure we log the year in
       each log line since the log entries will be kept around for several years.  Lastly,  we  dis‐
       able  shell escapes for the commands in the PAGERS _Cmnd_Alias_ (_/usr/bin/more_, _/usr/bin/pg_ and
       _/usr/bin/less_).  This will not effectively constrain users with **sudo ALL **privileges.

       # Override built-in defaults
       Defaults                syslog=auth,runcwd=~
       Defaults>root           !set_logname
       Defaults:FULLTIMERS     !lecture,runchroot=*
       Defaults:millert        !authenticate
       Defaults@SERVERS        log_year, logfile=/var/log/sudo.log
       Defaults!PAGERS         noexec

       The _User_ _specification_ is the part that actually determines who may run what.

       root            ALL = (ALL) ALL
       %wheel          ALL = (ALL) ALL

       We let **root **and any user in group **wheel **run any command on any host as any user.

       FULLTIMERS      ALL = NOPASSWD: ALL

       Full time sysadmins (**millert**, **mikef**, and **dowdy**) may run any command on any host  without  au‐
       thenticating themselves.

       PARTTIMERS      ALL = ALL

       Part  time sysadmins **bostley**, **jwfox**, and **crawl**) may run any command on any host but they must
       authenticate themselves first (since the entry lacks the NOPASSWD tag).

       jack            CSNETS = ALL

       The user **jack **may run any  command  on  the  machines  in  the  CSNETS  alias  (the  networks
       128.138.243.0,  128.138.204.0, and 128.138.242.0).  Of those networks, only 128.138.204.0 has
       an explicit netmask (in CIDR notation) indicating it is a class C  network.   For  the  other
       networks in CSNETS, the local machine's netmask will be used during matching.

       lisa            CUNETS = ALL

       The  user  **lisa  **may  run  any  command  on any host in the CUNETS alias (the class B network
       128.138.0.0).

       operator        ALL = DUMPS, KILL, SHUTDOWN, HALT, REBOOT, PRINTING,\
                       sudoedit /etc/printcap, /usr/oper/bin/

       The **operator **user may run commands limited to simple maintenance.  Here, those  are  commands
       related to backups, killing processes, the printing system, shutting down the system, and any
       commands  in  the  directory  _/usr/oper/bin/_.  One command in the DUMPS Cmnd_Alias includes a
       sha224 digest, _/home/operator/bin/start_backups_.  This is because  the  directory  containing
       the  script  is writable by the operator user.  If the script is modified (resulting in a di‐
       gest mismatch) it will no longer be possible to run it via **sudo**.

       joe             ALL = /usr/bin/su operator

       The user **joe **may only [_su_(1)](https://www.chedong.com/phpMan.php/man/su/1/markdown) to operator.

       pete            HPPA = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd *root*

       %opers          ALL = (: ADMINGRP) /usr/sbin/

       Users in the **opers **group may run commands in _/usr/sbin/_ as themselves with any group  in  the
       ADMINGRP _Runas_Alias_ (the **adm **and **oper **groups).

       The  user  **pete  **is allowed to change anyone's password except for **root **on the HPPA machines.
       Because command line arguments are matched as a single, concatenated string, the ‘*’ wildcard
       will match _multiple_ words.  This example assumes that [_passwd_(1)](https://www.chedong.com/phpMan.php/man/passwd/1/markdown) does not take  multiple  user
       names on the command line.  On systems with GNU [_getopt_(3)](https://www.chedong.com/phpMan.php/man/getopt/3/markdown), options to [_passwd_(1)](https://www.chedong.com/phpMan.php/man/passwd/1/markdown) may be speci‐
       fied after the user argument.  As a result, this rule will also allow:

           passwd username --expire

       which may not be desirable.

       bob             SPARC = (OP) ALL : SGI = (OP) ALL

       The  user  **bob  **may  run  anything on the SPARC and SGI machines as any user listed in the OP
       _Runas_Alias_ (**root **and **operator**.)

       jim             +biglab = ALL

       The user **jim **may run any command on  machines  in  the  _biglab_  netgroup.   **sudo  **knows  that
       “biglab” is a netgroup due to the ‘+’ prefix.

       +secretaries    ALL = PRINTING, /usr/bin/adduser, /usr/bin/rmuser

       Users  in the **secretaries **netgroup need to help manage the printers as well as add and remove
       users, so they are allowed to run those commands on all machines.

       fred            ALL = (DB) NOPASSWD: ALL

       The user **fred **can run commands as any user in the DB _Runas_Alias_ (**oracle **or  **sybase**)  without
       giving a password.

       john            ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*

       On  the ALPHA machines, user **john **may su to anyone except **root **but he is not allowed to spec‐
       ify any options to the [_su_(1)](https://www.chedong.com/phpMan.php/man/su/1/markdown) command.

       jen             ALL, !SERVERS = ALL

       The user **jen **may run any command on any machine except for those in  the  SERVERS  _Host_Alias_
       (primary, mail, www, and ns).

       jill            SERVERS = /usr/bin/, !SU, !SHELLS

       For  any  machine  in  the  SERVERS  _Host_Alias_,  **jill  **may run any commands in the directory
       _/usr/bin/_ except for those commands belonging to the SU and SHELLS _Cmnd_Aliases_.   While  not
       specifically  mentioned  in  the  rule,  the  commands in the PAGERS _Cmnd_Alias_ all reside in
       _/usr/bin_ and have the _noexec_ option set.

       steve           CSNETS = (operator) /usr/local/op_commands/

       The user **steve **may run any command in the directory /usr/local/op_commands/ but only as  user
       operator.

       matt            valkyrie = KILL

       On his personal workstation, valkyrie, **matt **needs to be able to kill hung processes.

       WEBADMIN        www = (www) ALL, (root) /usr/bin/su www

       On the host www, any user in the WEBADMIN _User_Alias_ (will, wendy, and wim), may run any com‐
       mand as user www (which owns the web pages) or simply [_su_(1)](https://www.chedong.com/phpMan.php/man/su/1/markdown) to www.

       ALL             CDROM = NOPASSWD: /sbin/umount /CDROM,\
                       /sbin/mount -o nosuid\,nodev /dev/cd0a /CDROM

       Any  user  may  mount  or  unmount  a  CD-ROM on the machines in the CDROM _Host_Alias_ (orion,
       perseus, hercules) without entering a password.  This is a bit tedious for users to type,  so
       it is a prime candidate for encapsulating in a shell script.

## SECURITY NOTES
   **Limitations of the **‘!’ operator
       It is generally not effective to “subtract” commands from **ALL **using the ‘!’ operator.  A user
       can trivially circumvent this by copying the desired command to a different name and then ex‐
       ecuting that.  For example:

       bill    ALL = ALL, !SU, !SHELLS

       Doesn't  really  prevent  **bill  **from running the commands listed in SU or SHELLS since he can
       simply copy those commands to a different name, or use a shell escape from an editor or other
       program.  Therefore, these kind of restrictions should be considered advisory  at  best  (and
       reinforced by policy).

       In  general,  if a user has sudo **ALL **there is nothing to prevent them from creating their own
       program that gives them a **root **shell (or making their own copy of a shell) regardless of  any
       ‘!’ elements in the user specification.

### Security implications of fast_glob
       If  the  _fast_glob_ option is in use, it is not possible to reliably negate commands where the
       path name includes globbing (aka wildcard) characters.   This  is  because  the  C  library's
       [_fnmatch_(3)](https://www.chedong.com/phpMan.php/man/fnmatch/3/markdown)  function cannot resolve relative paths.  While this is typically only an inconve‐
       nience for rules that grant privileges, it can result in a security issue for rules that sub‐
       tract or revoke privileges.

       For example, given the following _sudoers_ file entry:

       john    ALL = /usr/bin/passwd [a-zA-Z0-9]*, /usr/bin/chsh [a-zA-Z0-9]*,\
                     /usr/bin/chfn [a-zA-Z0-9]*, !/usr/bin/* root

       User **john **can still run ‘/usr/bin/passwd  root’  if  _fast_glob_  is  enabled  by  changing  to
       _/usr/bin_ and running ‘./passwd root’ instead.

       Another  potential  issue  is that when **sudo **executes the command, it must use the command or
       path specified by the user instead of a path listed in the _sudoers_ file.  This may lead to  a
       time of check versus time of use race condition.

### Wildcards in command arguments
       Command  line  arguments  are matched as a single, concatenated string.  This mean a wildcard
       character such as ‘?’ or ‘*’ will match across word boundaries, which may be unexpected.  For
       example, while a sudoers entry like:

           %operator ALL = /bin/cat /var/log/messages*

       will allow command like:

           $ sudo cat /var/log/messages.1

       It will also allow:

           $ sudo cat /var/log/messages /etc/shadow

       which is probably not what was intended.  A safer alternative is to use a regular  expression
       for matching command line arguments.  The above example can be rewritten as a regular expres‐
       sion:

           %operator ALL = /bin/cat ^/var/log/messages[^[:space:]]*$

       The  regular  expression  will  only  match  a  single  file  with  a  name  that begins with
       _/var/log/messages_ and does not include any white space in the name.  It is often better to do
       command line processing outside of the _sudoers_ file in a scripting language for anything non-
       trivial.

### Regular expressions in command names
       Using a regular expression to match a command name has the same security implications as  us‐
       ing the _fast_glob_ option:

       **•  **It is not possible to reliably negate commands when the path name is a regular expression.

       **•  **When  **sudo **executes the command, it must use the command or path specified by the user in‐
          stead of a path listed in the _sudoers_ file.  This may lead to a time of check versus  time
          of use race condition.

       These  issues  do  not apply to rules where only the command line options are matched using a
       regular expression.

### Preventing shell escapes
       Once **sudo **executes a program, that program is free to do whatever it pleases,  including  run
       other programs.  This can be a security issue since it is not uncommon for a program to allow
       shell  escapes,  which lets a user bypass **sudo**'s access control and logging.  Common programs
       that permit shell escapes include shells (obviously), editors, paginators, mail, and terminal
       programs.

       There are four basic approaches to this problem:

       restrict   Avoid giving users access to commands that allow the user to  run  arbitrary  com‐
                  mands.   Many  editors  have  a  restricted mode where shell escapes are disabled,
                  though **sudoedit **is a better solution to running editors  via  **sudo**.   Due  to  the
                  large number of programs that offer shell escapes, restricting users to the set of
                  programs that do not is often unworkable.

       intercept  On  most  systems, **sudo**'s _intercept_ functionality can be used to transparently in‐
                  tercept an attempt to run a new command, allow or deny it based on _sudoers_  rules,
                  and  log  the  result.  For example, this can be used to restrict the commands run
                  from within a privileged shell or editor.  However, not all programs operate  cor‐
                  rectly when _intercept_ is enabled.

                  There  are two underlying mechanisms that may be used to implement _intercept_ mode:
                  _dso_ and _trace_.  The _intercept_type_ setting can be used to select between them.

                  The first mechanism, _dso_, overrides the standard C library functions that are used
                  to execute a command.  It does this by setting an  environment  variable  (usually
                  LD_PRELOAD)  to the path of a dynamic shared object, or shared library, containing
                  custom versions  of  the  [_execve_(2)](https://www.chedong.com/phpMan.php/man/execve/2/markdown),  [_execl_(3)](https://www.chedong.com/phpMan.php/man/execl/3/markdown),  [_execle_(3)](https://www.chedong.com/phpMan.php/man/execle/3/markdown),  [_execlp_(3)](https://www.chedong.com/phpMan.php/man/execlp/3/markdown),  [_execv_(3)](https://www.chedong.com/phpMan.php/man/execv/3/markdown),
                  [_execvp_(3)](https://www.chedong.com/phpMan.php/man/execvp/3/markdown),  [_execvpe_(3)](https://www.chedong.com/phpMan.php/man/execvpe/3/markdown),  and [_system_(3)](https://www.chedong.com/phpMan.php/man/system/3/markdown) library functions that connect back to **sudo**
                  for a policy decision.  Note, however, that  this  applies  only  to  dynamically-
                  linked  executables.   It  is  not  possible to intercept commands for statically-
                  linked executables or executables that run under binary emulation this  way.   Be‐
                  cause most dynamic loaders ignore LD_PRELOAD (or the equivalent) when running set-
                  user-ID and set-group-ID programs, **sudoers **will not permit such programs to be run
                  in  _intercept_  mode  by  default.   The  _dso_ mechanism is incompatible with **sudo**'s
                  SELinux RBAC support (but see below).  SELinux disables LD_PRELOAD by default  and
                  interferes with file descriptor inheritance, which **sudo **relies on.

                  The second mechanism, _trace_, is available on Linux systems that support [_seccomp_(2)](https://www.chedong.com/phpMan.php/man/seccomp/2/markdown)
                  filtering.   It  uses  [_ptrace_(2)](https://www.chedong.com/phpMan.php/man/ptrace/2/markdown)  and [_seccomp_(2)](https://www.chedong.com/phpMan.php/man/seccomp/2/markdown) to intercept the [_execve_(2)](https://www.chedong.com/phpMan.php/man/execve/2/markdown) system
                  call instead of pre-loading a dynamic shared object.  Both static and dynamic exe‐
                  cutables are supported and it is compatible with **sudo**'s SELinux RBAC mode.   Func‐
                  tions utilizing the [_execveat_(2)](https://www.chedong.com/phpMan.php/man/execveat/2/markdown) system call, such as [_fexecve_(3)](https://www.chedong.com/phpMan.php/man/fexecve/3/markdown), are not currently
                  intercepted.   Programs  that  rely on [_ptrace_(2)](https://www.chedong.com/phpMan.php/man/ptrace/2/markdown) themselves, such as debuggers and
                  system call tracers (such as [_strace_(1)](https://www.chedong.com/phpMan.php/man/strace/1/markdown) and [_truss_(1)](https://www.chedong.com/phpMan.php/man/truss/1/markdown)) will be unable to function if
                  _intercept_ is enabled  in  _trace_  mode.   This  same  restriction  applies  to  the
                  _log_subcmds_ sudoers option.

                  The  _intercept_ feature is known to work on Solaris, *BSD, Linux, macOS, HP-UX 11.x
                  and AIX 5.3 and above.  It should be supported on most operating systems that sup‐
                  port the LD_PRELOAD environment variable or an equivalent.  It is not possible  to
                  intercept  shell built-in commands or restrict the ability to read or write sensi‐
                  tive files from within a shell.

                  To enable intercept mode on a per-command basis, use the INTERCEPT  tag  as  docu‐
                  mented in the User Specification section above.  Here is that example again:

                  chuck   research = INTERCEPT: ALL

                  This  allows  user **chuck **to run any command on the machine “research” in intercept
                  mode.  Any commands run via shell escapes will be validated and  logged  by  **sudo**.
                  If  you  are unsure whether or not your system is capable of supporting _intercept_,
                  you can always just try it out and check whether or not external commands run  via
                  a shell are logged when _intercept_ is enabled.

                  There  is  an  inherent  race  condition between when a command is checked against
                  **sudoers **rules and when it is actually executed.  If a user is allowed to run arbi‐
                  trary commands, they may be able to change the [_execve_(2)](https://www.chedong.com/phpMan.php/man/execve/2/markdown) arguments in the  program
                  after  the  **sudoers  **policy check has completed but before the new command is exe‐
                  cuted.  Starting with version 1.9.12, the _trace_ method will verify that  the  com‐
                  mand  and  its arguments have not changed after [_execve_(2)](https://www.chedong.com/phpMan.php/man/execve/2/markdown) has completed but before
                  execution of the new program has had a chance to run.  This is not the  case  with
                  the  _dso_ method.  See the description of the _intercept_verify_ setting for more in‐
                  formation.

       log        There are two separate but related ways to log additional commands.  The first  is
                  to enable I/O logging using the _log_output_ flag.  This will log the command's out‐
                  put  but  will  not  create an event log entry when the additional command is run.
                  The second is to enable the _log_subcmds_ flag in _sudoers_ which will create an event
                  log entry every time a new command is run.  If I/O logging is  also  enabled,  the
                  log entry will include a time offset into the I/O log to indicate when the command
                  was run.  This offset can be passed to the [_sudoreplay_(8)](https://www.chedong.com/phpMan.php/man/sudoreplay/8/markdown) utility to replay the I/O
                  log  at  the exact moment when the command was run.  The _log_subcmds_ flag uses the
                  same mechanism as _intercept_ (see above) and has the same limitations.

       noexec     **sudo**'s _noexec_ functionality can be used to prevent a program run by **sudo **from exe‐
                  cuting any other programs.  On most systems, it uses the same LD_PRELOAD mechanism
                  as _intercept_ (see above) and thus the same caveats apply.  The _noexec_  functional‐
                  ity  is capable of blocking execution of commands run via the [_execve_(2)](https://www.chedong.com/phpMan.php/man/execve/2/markdown), [_execl_(3)](https://www.chedong.com/phpMan.php/man/execl/3/markdown),
                  [_execle_(3)](https://www.chedong.com/phpMan.php/man/execle/3/markdown),  [_execlp_(3)](https://www.chedong.com/phpMan.php/man/execlp/3/markdown),  [_exect_(3)](https://www.chedong.com/phpMan.php/man/exect/3/markdown),  [_execv_(3)](https://www.chedong.com/phpMan.php/man/execv/3/markdown),  [_execveat_(3)](https://www.chedong.com/phpMan.php/man/execveat/3/markdown),  [_execvP_(3)](https://www.chedong.com/phpMan.php/man/execvP/3/markdown),  [_execvp_(3)](https://www.chedong.com/phpMan.php/man/execvp/3/markdown),
                  [_execvpe_(3)](https://www.chedong.com/phpMan.php/man/execvpe/3/markdown),  [_fexecve_(3)](https://www.chedong.com/phpMan.php/man/fexecve/3/markdown), [_popen_(3)](https://www.chedong.com/phpMan.php/man/popen/3/markdown), [_posix_spawn_(3)](https://www.chedong.com/phpMan.php/man/posixspawn/3/markdown), [_posix_spawnp_(3)](https://www.chedong.com/phpMan.php/man/posixspawnp/3/markdown), [_system_(3)](https://www.chedong.com/phpMan.php/man/system/3/markdown), and
                  [_wordexp_(3)](https://www.chedong.com/phpMan.php/man/wordexp/3/markdown) functions.  On Linux, a [_seccomp_(2)](https://www.chedong.com/phpMan.php/man/seccomp/2/markdown) filter is used to implement  _noexec_.
                  On Solaris 10 and higher, _noexec_ uses Solaris privileges instead of the LD_PRELOAD
                  environment variable.

                  To enable _noexec_ for a command, use the NOEXEC tag as documented in the User Spec‐
                  ification section above.  Here is that example again:

                  aaron   shanty = NOEXEC: /usr/bin/more, /usr/bin/vi

                  This  allows  user **aaron **to run _/usr/bin/more_ and _/usr/bin/vi_ with _noexec_ enabled.
                  This will prevent those two commands from executing  other  commands  (such  as  a
                  shell).   If  you  are  unsure whether or not your system is capable of supporting
                  _noexec_ you can always just try it out and check whether shell  escapes  work  when
                  _noexec_ is enabled.

       Restricting  shell  escapes  is not a panacea.  Programs running as **root **are still capable of
       many potentially hazardous operations (such as changing or overwriting files) that could lead
       to unintended privilege escalation.  In the specific case of an editor, a safer  approach  is
       to give the user permission to run **sudoedit **(see below).

### Secure editing
       The  **sudoers  **plugin includes **sudoedit **support which allows users to securely edit files with
       the editor of their choice.  As **sudoedit **is a built-in command, it must be specified  in  the
       _sudoers_  file  without a leading path.  However, it may take command line arguments just as a
       normal command does.  Wildcards used in _sudoedit_ command line arguments are  expected  to  be
       path names, so a forward slash (‘/’) will not be matched by a wildcard.

       Unlike  other  **sudo **commands, the editor is run with the permissions of the invoking user and
       with the environment unmodified.  More information may be found in the description of the  **-e**
       option in [_sudo_(8)](https://www.chedong.com/phpMan.php/man/sudo/8/markdown).

       For example, to allow user operator to edit the “message of the day” file on any machine:

           operator ALL = sudoedit /etc/motd

       The operator user then runs **sudoedit **as follows:

           $ sudoedit /etc/motd

       The  editor will run as the operator user, not **root**, on a temporary copy of _/etc/motd_.  After
       the file has been edited, _/etc/motd_ will be updated with the contents of the temporary copy.

       Users should _never_ be granted **sudoedit **permission to edit a file that resides in a  directory
       the  user  has write access to, either directly or via a wildcard.  If the user has write ac‐
       cess to the directory it is possible to replace the legitimate file with a  link  to  another
       file,  allowing  the  editing  of  arbitrary  files.   To prevent this, starting with version
       1.8.16, symbolic links will not be followed in writable directories and **sudoedit **will  refuse
       to  edit  a file located in a writable directory unless the _sudoedit_checkdir_ option has been
       disabled or the invoking user is **root**.  Additionally, in version 1.8.15 and higher,  **sudoedit**
       will  refuse  to  open a symbolic link unless either the _sudoedit_follow_ option is enabled or
       the _sudoedit_ command is prefixed with the FOLLOW tag in the _sudoers_ file.

### Time stamp file checks
       **sudoers **will check the ownership of its time stamp directory (_/run/sudo/ts_  by  default)  and
       ignore  the  directory's  contents  if it is not owned by **root **or if it is writable by a user
       other than **root**.  Older versions of **sudo **stored time stamp files in _/tmp_; this is  no  longer
       recommended  as  it may be possible for a user to create the time stamp themselves on systems
       that allow unprivileged users to change the ownership of files they create.

       While the time stamp directory _should_ be cleared at reboot time, not all  systems  contain  a
       _/run_  or  _/var/run_  directory.   To  avoid potential problems, **sudoers **will ignore time stamp
       files that date from before the machine booted on systems where the boot time is available.

       Some systems with graphical desktop environments allow unprivileged users to change the  sys‐
       tem  clock.   Since  **sudoers  **relies on the system clock for time stamp validation, it may be
       possible on such systems for a user to run **sudo **for longer than _timestamp_timeout_ by  setting
       the clock back.  To combat this, **sudoers **uses a monotonic clock (which never moves backwards)
       for its time stamps if the system supports it.

       **sudoers  **will  not  honor time stamps set far in the future.  Time stamps with a date greater
       than current_time + 2 * TIMEOUT will be ignored and **sudoers **will log and complain.

       If the _timestamp_type_ option is set to “tty”, the time stamp record includes the device  num‐
       ber  of the terminal the user authenticated with.  This provides per-terminal granularity but
       time stamp records may still outlive the user's session.

       Unless the _timestamp_type_ option is set to “global”, the time stamp record also includes  the
       session ID of the process that last authenticated.  This prevents processes in different ter‐
       minal  sessions  from  using  the same time stamp record.  On systems where a process's start
       time can be queried, the start time of the session leader  is  recorded  in  the  time  stamp
       record.   If  no terminal is present or the _timestamp_type_ option is set to “ppid”, the start
       time of the parent process is used instead.  In most cases this will  prevent  a  time  stamp
       record  from  being re-used without the user entering a password when logging out and back in
       again.

## DEBUGGING
       Versions 1.8.4 and higher of the **sudoers **plugin support a flexible debugging  framework  that
       can  help  track down what the plugin is doing internally if there is a problem.  This can be
       configured in the [_sudo.conf_(5)](https://www.chedong.com/phpMan.php/man/sudo.conf/5/markdown) file.

       The **sudoers **plugin uses the same debug flag format as the **sudo **front-end: _subsystem_@_priority_.

       The priorities used by **sudoers**, in order  of  decreasing  severity,  are:  _crit_,  _err_,  _warn_,
       _notice_,  _diag_, _info_, _trace_, and _debug_.  Each priority, when specified, also includes all pri‐
       orities higher than it.  For example, a priority  of  _notice_  would  include  debug  messages
       logged at _notice_ and higher.

       The following subsystems are used by the **sudoers **plugin:

       _alias_     _User_Alias_, _Runas_Alias_, _Host_Alias_ and _Cmnd_Alias_ processing

       _all_       matches every subsystem

       _audit_     BSM and Linux audit code

       _auth_      user authentication

       _defaults_  _sudoers_ file _Defaults_ settings

       _env_       environment handling

       _ldap_      LDAP-based sudoers

       _logging_   logging support

       _match_     matching of users, groups, hosts, and netgroups in the _sudoers_ file

       _netif_     network interface handling

       _nss_       network service switch handling in **sudoers**

       _parser_    _sudoers_ file parsing

       _perms_     permission setting

       _plugin_    The equivalent of _main_ for the plugin.

       _pty_       pseudo-terminal related code

       _rbtree_    redblack tree internals

       _sssd_      SSSD-based sudoers

       _util_      utility functions

       For example:

       Debug sudoers.so /var/log/sudoers_debug match@info,nss@info

       For more information, see the [_sudo.conf_(5)](https://www.chedong.com/phpMan.php/man/sudo.conf/5/markdown) manual.

## SEE ALSO
       [_ssh_(1)](https://www.chedong.com/phpMan.php/man/ssh/1/markdown),  [_su_(1)](https://www.chedong.com/phpMan.php/man/su/1/markdown),  [_fnmatch_(3)](https://www.chedong.com/phpMan.php/man/fnmatch/3/markdown),  [_glob_(3)](https://www.chedong.com/phpMan.php/man/glob/3/markdown),  [_mktemp_(3)](https://www.chedong.com/phpMan.php/man/mktemp/3/markdown), [_strftime_(3)](https://www.chedong.com/phpMan.php/man/strftime/3/markdown), [_sudo.conf_(5)](https://www.chedong.com/phpMan.php/man/sudo.conf/5/markdown), [_sudo_plugin_(5)](https://www.chedong.com/phpMan.php/man/sudoplugin/5/markdown),
       [_sudoers.ldap_(5)](https://www.chedong.com/phpMan.php/man/sudoers.ldap/5/markdown), [_sudoers_timestamp_(5)](https://www.chedong.com/phpMan.php/man/sudoerstimestamp/5/markdown), [_sudo_(8)](https://www.chedong.com/phpMan.php/man/sudo/8/markdown), [_visudo_(8)](https://www.chedong.com/phpMan.php/man/visudo/8/markdown)

## AUTHORS
       Many people have worked on **sudo **over the years; this version consists of code written primar‐
       ily by:

             Todd C. Miller

       See the CONTRIBUTORS.md file in the  **sudo  **distribution  (<https://www.sudo.ws/about/contribu>‐
       tors/) for an exhaustive list of people who have contributed to **sudo**.

## CAVEATS
       The  _sudoers_  file  should  **always  **be  edited by the **visudo **utility which locks the file and
       checks for syntax errors.  If _sudoers_ contains syntax errors, **sudo **may refuse to  run,  which
       is  a  serious problem if **sudo **is your only method of obtaining superuser privileges.  Recent
       versions of **sudoers **will attempt to recover after a syntax error by ignoring the rest of  the
       line  after encountering an error.  Older versions of **sudo **will not run if _sudoers_ contains a
       syntax error.

       When using netgroups of machines (as opposed to users), if you  store  fully  qualified  host
       name  in  the  netgroup  (as is usually the case), you either need to have the machine's host
       name be fully qualified as returned by the  _hostname_  command  or  use  the  _fqdn_  option  in
       _sudoers_.

## BUGS
       If   you   believe  you  have  found  a  bug  in  **sudo**,  you  can  submit  a  bug  report  at
       <https://bugzilla.sudo.ws/>

## SUPPORT
       Limited   free   support   is   available   via   the   sudo-users    mailing    list,    see
       <https://www.sudo.ws/mailman/listinfo/sudo-users> to subscribe or search the archives.

## DISCLAIMER
       **sudo  **is  provided  “AS IS” and any express or implied warranties, including, but not limited
       to, the implied warranties of merchantability and fitness for a particular purpose  are  dis‐
       claimed.  See the LICENSE.md file distributed with **sudo **or <https://www.sudo.ws/about/license/>
       for complete details.

Sudo 1.9.15p5                             December 19, 2023                               [_SUDOERS_(5)](https://www.chedong.com/phpMan.php/man/SUDOERS/5/markdown)
