Linux:sudo选择特定用户身份执行某命令(集)

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

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不仅仅有这些功能。以上列出的是最常见、最实用的功能点。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值