7.11 sudo:以另一个用户身份执行命令
7.11.1 命令详解
【命令星级】 ★★★★★
【功能说明】
sudo命令可以让普通用户在执行指定的命令或程序时,拥有超级用户(也可以是其他用户)的权限,并且可以有针对性地(精细)将不同命令或程序授予指定的普通用户,同时普通用户不需要知道root密码就可以得到授权,这个授权可以使用visudo配置管理。
【语法格式】
sudo [option]
sudo [选项]
**说明:**在sudo命令以及后面的选项和用户名里,每个元素直接都至少要有一个空格。
【选项说明】
表7-14针对该命令的参数选项进行了说明。
表7-14 sudo命令的参数选项及说明
7.11.2 使用范例
**范例7-23:**查看用户被visudo授权后拥有的权限。
在7.10节,我们已经对neteagle用户进行了授权,此时再以neteagle用户的身份登录系统,就可以通过执行类似于sudo ls -l /root(sudo后面加上正常命令)的命令来以root用户的权限管理系统了,命令如下:
[neteagle@centos7 ~]$ ls /root
ls: cannot open directory /root: Permission denied #可以看到,neteagle用户是无法直接访问/root家目录的。
[neteagle@centos7 ~]$ sudo ls /root #如果授权配置中含有NOPASSWD,则执行时不提示密码,否则会要求输入当前用户的密码。
anaconda-ks.cfg
#通过sudo命令使得neteagle用户具备访问/root目录的权限。
对于上述代码段的说明,具体如下:
-
通过sudo授权管理后,所有用户执行授权的特殊权限格式为“sudo 命令”。
-
如果需要切换到root执行相关操作,则可以通过“sudo su -”命令,注意,此命令提示的密码为当前用户的密码,而不是root的密码。
-
执行“sudo -l”命令可以查看当前用户被授予的sudo权限集合。
以下是查看younggirl用户授权的结果情况:
[C:\~]$ ssh [email protected] Connecting to 10.0.0.201:22... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. WARNING! The remote SSH server rejected X11 forwarding request. Last login: Sun Oct 18 14:58:13 2020 Wellcome to Linux! [younggirl@centos7 ~]$ sudo -l #注意,这里是younggirl用户,授权较低。 We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. [sudo] password for younggirl: #提示输入密码,注意是younggirl用户的密码,而非root密码。 Matching Defaults entries for younggirl on centos7: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin User younggirl may run the following commands on centos7: (ALL) /usr/sbin/useradd, /usr/sbin/userdel #查看到younggirl用户被授权的权限。
-
对于Linux系统bash的内置命令,一般无法进行sudo授权,例如,cd命令。
sudo授权与su切换的原理示意图如图7-1所示。
图7-1 su与sudo用户角色切换原理图
生产环境中通常会禁止root远程登录,不过,系统会为每个运维人员建立一个普通账户,然后根据运维人员的要求,通过sudo控制登录系统的权限,事实证明这是一个不错的权限管理方式。当然,笔者在生产环境中还使用了ldap统一认证登录及授权管理的方式。
普通用户的环境变量问题:在早期的CentOS 5系统中,普通用户在执行系统管理相关的命令时会遭遇到环境变量的问题,导致找不到执行的命令(CentOS 6以后的系统已经不存在这个问题了)。
sudo授权对于bash的内置命令处理是个难题,因为内置命令没有实体文件和路径,不过一般都有解决方法,例如可以使用sudo ls替代sudo cd,有的网友使用sudo bash后再使用内置命令,这与做是很危险的,不推荐使用这种方法。
7.11.3 扩展知识
【时间戳文件位置】
以下命令可用查看CentOS 5.8的时间戳文件位置:
[root@centos5 ~]# ll /var/run/sudo
total 0
drwx------. 2 root neteagle 4096 8-25 12:21 neteagle
要想查看CentOS 6的时间戳文件位置,则要使用如下命令:
[root@centos6 ~]# ll /var/db/sudo
total 4
drwx------ 2 root neteagle 4096 Feb 10 10:35 neteagle #初始状态是没有这个文件。
若要查看CentOS 7的时间戳文件位置,则要使用如下命令:
[root@centos7 ~]# ll /var/run/sudo
total 0
drwx------. 2 root root 60 Oct 18 17:56 ts
待用户执行sudo并且输入密码后,用户会获得一张默认存活期为5分钟的“入场券”(默认值可以在编译的时候改变)。但超时以后,用户就必须重新输入密码了。
可以使用sudo的-k或-K参数清空sudo用户的时间戳,这样还会提示输入密码,但是如果配置授权对应的用户时加入了NOPASSWD选项,那么执行sudo命令时就永久不会提示输入密码了。
【sudo的配置文件/etc/sudoers】
以下命令可用于查看sudo的配置文件/etc/sudoers里的内容:
[root@centos7 ~]# ll /etc/sudoers
-r--r-----. 1 root root 4441 Oct 18 17:40 /etc/sudoers
建议使用visudo编辑这个文件,因为该命令带有语法检查,否则一旦出错了,普通用户就会无法使用sudo了。直接在命令行执行visudo即可自动打开/etc/sudoers文件。
如果是通过vim编辑/etc/sudoers,则在保存时要使用"wq!"强制保存,否则会提示只读不能保存的错误,而且最后还要用visudo -c做语法检查,这与做实在是太麻烦了,无特殊要求时建议都使用visudo编辑sudo的配置文件。
7.12 id:显示用户与用户组的信息
7.12.1 命令详解
【命令星级】 ★★★★★
【功能说明】
id命令通常用了查询用户和组信息以及对应的UID、GID等信息。
【语法格式】
id [option] [username]
id [选项] [用户名]
**说明:**在id命令以及后面的选项和用户名里,每个元素直接都至少要有一个空格。
【选项说明】
表7-15针对该命令的参数选项进行了说明。
表7-15 id命令的参数选项及说明
7.12.2 使用范例
**范例7-24:**显示用户的UID和GID等信息。
[root@centos7 ~]# id neteagle #查看neteagle的用户及组相关的信息。
uid=1004(neteagle) gid=1005(incahome) groups=1005(incahome) #用户和组信息以及对应的UID、GID。
[root@centos7 ~]# id -u neteagle #只查看用户UID。
1004
[root@centos7 ~]# id -g neteagle #只查看用户GID。
1005
[root@centos7 ~]# id -un neteagle #只查看用户名。
neteagle
[root@centos7 ~]# id -gn neteagle #只查看用户组名。
incahome