linux权限sudoers完整总结
sudoers 的作用:在/etc/sudoers
文件里面可以配置某个普通用户
以其他用户
的身份来执行某些命令,比如sudo command
、sudo -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 command
、sudo -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