Linux:sudo选择特定用户身份执行某命令(集)
sudo = switch user do
sudo allows a permitted user to execute a command as the superuser or another user, as specified by the security policy.
有时我们有这样的需求:
让一个普通用户以某个特定的用户身份(大多数情况下是root)执行某个命令(或命令集合)。
当然我们可以通过su(switch user)来先切到特定用户,然后执行一些命令。
有没有更简单的方法?可以使用sudo。
此命令允许某指定用户“在安全策略许可范围内”(/etc/sudoers)以特定用户执行命令。
sudo的“安全策略文件”是/etc/sudoers,里面设定了很多的规则,用以描述某个用户拥有怎样的权限,可以执行怎样的命令。
如果要使用sudo,则必须预先配置/etc/sudoers策略文件。
/etc/sudoers文件有特定的语法规则,我们最好不要通过vi/vim等编辑器直接对其进行编辑(虽然也可行),而是通过visudo命令去修改。
visudo是一个类似vi/vim的编辑器,通过visudo命令修改/etc/sudoers策略文件,在退出保存时,visudo会对策略文件语法进行校验,以防止对策略文件写入不符合语法规范的错误配置信息,导致sudo异常。
简单来说:visudo = vi + 对策略文件进行语法校验功能。
场景一:给普通用户jiang以root权限,能以root身份执行任何命令(例如执行passwd改密码)
我们首先要在root身份下执行visudo,编辑/etc/sudoers策略文件,给用户jiang以root权限。
1.直接命令行输入visudo,不带任何参数
2.在策略文件末尾附近,找到
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
3.新加入一行
jiang ALL=(ALL) ALL
4.保存退出
==>到此为止,用户jiang已经有“root权限”啦!如何使用这个权限呢?
例如我要用root身份创建一个example.json的空文件,我可以:
[jiang@localhost ~]$ sudo touch example.json
输出:
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 jiang:
此时应当输入用户jiang的密码。对的,没看错,是用户jiang,而不是用户root的密码。
虽然用户jiang是有权限指定权限的,但是系统怎么知道执行sudo的是不是真的是“用户jiang”本人呢?那就用jiang的密码来校验喽!
检查创建结果:
[jiang@localhost ~]$ ll *
-rw-r--r--. 1 root root 0 May 10 13:05 example.json
更为常见的是,通过sudo,切到root身份,然后执行操作。
[jiang@localhost ~]$ sudo su - root
[sudo] password for jiang:
[root@localhost ~]# whoami
root
sudo如何使用:
$ sudo [-u user] cmds
可以通过-u来执行要切换到哪个身份。例如,要切换到sshd,可以执行sudo -u sshd cmds。
如果不指定-u,则使用root用户身份。
场景二:sudo免密
我们使用sudo时,在间隔一段时间后总会要求输入当前用户(jiang)的密码,用以供系统确认“执行sudo的确实是jiang本人”。
能否忽略掉这一验证,让系统不校验身份,总是认为执行root的是jiang本人?
通过执行visudo命令,修改/etc/sudoers策略文件:
将:
jiang ALL=(ALL) ALL
改为:
jiang ALL=(ALL) NOPASSWD: ALL
保存退出。
这次,无论间隔多长时间,系统都不需要再次对jiang用户进行密码鉴权,而总是认为“是jiang用户本人在执行sudo及后续命令”。
场景三:sudo 用户组 免密
我想要让所有归属于jiang的用户组的用户,都拥有同一权限。
visudo修改/etc/sudoers,
将
jiang ALL=(ALL) NOPASSWD: ALL
改为:
%jiang ALL=(ALL) NOPASSWD: ALL
注意jiang之前的百分号,指代后面的jiang是一个用户组。
现在有一个普通用户test1280:
[test1280@localhost ~]$ id
uid=501(test1280) gid=501(test1280) groups=501(test1280) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
将其加入到jiang用户组:
[root@localhost ~]# usermod -a -G jiang test1280
再查看test1280的用户组:
[test1280@localhost ~]$ id
uid=501(test1280) gid=501(test1280) groups=501(test1280),500(jiang) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
在test1280用户身份下切到root用户身份:
[test1280@localhost ~]$ sudo su -
[root@localhost ~]#
总结:
1.jiang ALL=(ALL) ALL
2.jiang ALL=(ALL) NOPASSWD: ALL
3.%jiang ALL=(ALL) NOPASSWD: ALL
当然啦,sudo以及visudo不仅仅有这些功能。以上列出的是最常见、最实用的功能点。

本文介绍如何使用 Linux 下的 sudo 命令使普通用户能够以 root 或其他特定用户的身份执行命令,包括配置 /etc/sudoers 文件以实现密码验证和免密码执行。
6270

被折叠的 条评论
为什么被折叠?



