已复制
全屏展示
复制代码

linux权限sudoers完整总结


· 7 min read

sudoers 的作用:在/etc/sudoers文件里面可以配置某个普通用户其他用户的身份来执行某些命令,比如sudo commandsudo -u username command

一. 语法格式

通常我们编辑的是指定某些用户有执行某些命令的权限,比如

# 表示root用户在所有主机上可以切换到任何用户执行所有命令
root    ALL=(ALL)       ALL

通常语法格式为:who which_hosts=(runas) [NOPASSWD:] command

  • who
    表示什么用户(username)、用户组(%usergroup)可以执行。
  • which_hosts
    在哪台主机上的权限。在某些场景下,同一个/etc/sudoers文件是被所有的主机共享的,所以which_hosts表示了在哪一台主机上有权限执行指定命令。
  • runas
    以哪个用户(username)、用户组(:usergroup)的身份执行,如果省略,表示切换到root用户,如果为ALL, 表示能够切换到任何用户,或者同时指定(username:usergroup)。然后在命令行使用:sudo -u username commandsudo -g usergroup command来切换用户执行。
  • NOPASSWD
    NOPASSWD是可选参数,表示执行命令时可以不输入密码。其实可以控制部分命令需要输入密码,部分命令不输入密码:
# 将需要输入密码的放在前面,不需要输入密码的放在后面
tools   ALL=(ALL) /bin/w,/bin/pwd, (ALL) NOPASSWD: /usr/sbin/ip
  • command
    可以执行的命令,多条命令用逗号分隔,注意:这里的command必须是全路径,比如/bin/cp

二. 别名定义

别名的定义支持4类,注意:别名的名字必须是全英文大写字母的组合。

  • User_Alias ADMINS = jsmith, mikem
    User_Alias:可以是用户名,组名(%group),或者是其他的用户别名等。
  • Host_Alias FILESERVERS = fs1, fs2
    Host_Alias:可以是主机名、IP地址、CIDR或者是其他的主机别名
  • Runas_Alias TEST = test1, test2
    Runas_Alias:可以是用户名、组名(%group)或者是其他的用户别名等。
  • Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
    Cmnd_Alias:可以是命令名(绝对路径)、目录(包括该目录下的所有指令)或者是其他的命令别名

三. 常用技巧

3.1 使用visudo

在编辑sudoers文件的时候难免会出现语法错误,使用 visudo 命令可以避免,它在保存退出时会检查语法的正确性,另外可以指定 visudo 命令使用vim编辑器,使得编辑时时高亮的

export EDITOR=vim
visudo

3.2 条目位置

新添加的条目最好放在文件末尾,否则在某些系统可能不成功。

原因:比如在centos中,安装操作系统创建的普通用户时,会提示是否将该普通用户加入管理员组,如果选择了该选项,该普通用户就好被加入到wheel组里面,而在/etc/sudoers里面有关于wheel组的配置:%wheel ALL=(ALL) ALL,如果设置普通用户的 sudo 权限是不是在最后一行,则有可能被覆盖。

四. 配置Defaults

4.1 visiblepw

表示当远程该主机执行命令时,如果使用了sudo执行命令,则回显输入的密码,如果不设置visiblepw,则会报错。

Defaults   visiblepw
    # 输入密码时会回显密码
    # ssh username@x.x.x.x sudo ls /root
    # username@x.x.x.x's password: 
    # [sudo] password for tools: 123456
Defaults   !visiblepw
    # 报错
    # ssh yzy@x.x.x.x sudo ls /root
    # username@x.x.x.x's password: 
    # sudo: no tty present and no askpass program specified

五. 常见错误

5.1 requiretty

有时候会出现提示:

sudo: sorry, you must have a tty to run sudo

解决办法:增加Defaults requiretty配置,表示不需要控制终端。

5.2 visiblepw

有时候会出现提示:

ssh yzy@x.x.x.x sudo ls /root
username@x.x.x.x's password: 
sudo: no tty present and no askpass program specified

解决办法1:添加Defaults visiblepw

解决办法2:添加-t参数ssh -t yzy@x.x.x.x sudo ls /root

5.3 添加sudoers配置

有时候,在使用sudo命令的时候,您会遇到如下的提示:

xxx is not in the sudoers file.This incident will be reported

切换到 root 用户下,给该用户授权。

六. 常用选项

$ sudo --help
sudo - execute a command as another user

usage: sudo -h | -K | -k | -V
usage: sudo -v [-AknS] [-g group] [-h host] [-p prompt] [-u user]
usage: sudo -l [-AknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]
usage: sudo [-AbEHknPS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] [VAR=value] [-i|-s] [<command>]
usage: sudo -e [-AknS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] file ...

Options:
  -A, --askpass                 use a helper program for password prompting
  -b, --background              run command in the background
  -C, --close-from=num          close all file descriptors >= num
  -E, --preserve-env            preserve user environment when running command
      --preserve-env=list       preserve specific environment variables
  -e, --edit                    edit files instead of running a command
  -g, --group=group             run command as the specified group name or ID
  -H, --set-home                set HOME variable to target user's home dir
  -h, --help                    display help message and exit
  -h, --host=host               run command on host (if supported by plugin)
  -i, --login                   run login shell as the target user; a command may also be specified
  -K, --remove-timestamp        remove timestamp file completely
  -k, --reset-timestamp         invalidate timestamp file
  -l, --list                    list user's privileges or check a specific command; use twice for longer format
  -n, --non-interactive         non-interactive mode, no prompts are used
  -P, --preserve-groups         preserve group vector instead of setting to target's
  -p, --prompt=prompt           use the specified password prompt
  -r, --role=role               create SELinux security context with specified role
  -S, --stdin                   read password from standard input
  -s, --shell                   run shell as the target user; a command may also be specified
  -t, --type=type               create SELinux security context with specified type
  -T, --command-timeout=timeout terminate command after the specified time limit
  -U, --other-user=user         in list mode, display privileges for user
  -u, --user=user               run command (or edit file) as specified user name or ID
  -V, --version                 display version information and exit
  -v, --validate                update user's timestamp without running a command
  --                            stop processing command line arguments

6.1 -l, --list

列出当前用户可以执行的命令

$ sudo -l
Matching Defaults entries for yzy on m:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, pwfeedback

User yzy may run the following commands on m:
    (ALL : ALL) ALL

6.2 -U, --other-user=username

列出指定用户可以执行的命令。 此参数必须与-l参数一起使用

6.3 -k, --reset-timestamp

把时间戳缓存文件中的时间戳清除掉。当一次使用sudo命令,提示输入当前用户的密码后,在一定的时间内,再次执行sudo命令,就不用输入当前用户的密码了,这个世界一般是5分钟,实际上,就是在文件中记录了时间戳, 每次执行sudo就去比较一下,如果这个时间戳文件不存在或者文件里面没有记录时间戳、再或者时间戳超过了5分钟, 就提示用户输入当前用户的密码。

sudo -k

联合其他命令使用时,不更新时间戳缓存文件,同时也不会读取缓存文件时间来判断是否要输入密码(会提示输入密码)。

sudo -k ls /root
[sudo] password for xxx:

6.4 -K, --remove-timestamp

完全清除时间戳缓存文件。

6.5 -n, --non-interactive

sudo命令默认是以交互方式运行的,当需要用户输入当前用户的密码的时候,在控制台提示用户,并等待用户输入密码。当需要用户输入当前用户的密码的时候,直接出错。

6.6 -p, --prompt=prompt

指定输入密码的提示内容:

sudo -p "sudo need password of %u: " ls /root 
sudo need password of tools:

下面的变量可以直接使用在提示中:

  • %u 当前用户
  • %U 如果使用-u参数指定了用户,那么就是-u参数指定的用户,如果没有使用-u参数,那么就是root用户
  • %h 机器名(简单)
  • %H 机器名(完整)

6.7 -e, --edit=filepath

打开文件进行查看或者编辑。 相当于执行sudoedit命令,它会调用默认的编辑export EDITOR=vim

6.8 -u, --user=user

指定要以哪个用户权限执行命令,默认是root。

sudo -u hdfs hadoop fs -ls /

6.9 -S, --stdin

将密码通过标准输入传递给 sudo,而非交互式提交。

echo passwordxxx | sudo -S -k ls /root

七. 普通用户加入sudo且免密执行

Ubuntu 和 CentOS 是一样的,在 root 用户下运行 visudo

# 在末尾添加
yzy ALL=(ALL) NOPASSWD: ALL

🔗

文章推荐