sudo命令程序用法
sudo(superuser do)是一个在Linux和Unix系统中广泛使用的命令行程序,它允许授权的用户以另一个用户的身份,通常是超级用户(root)来运行命令,sudo主要特性如下:
- 权限提升:
sudo命令提升普通用户的权限,使其能够执行原本需要更高权限才能运行的命令 - 安全机制:通过
sudo,系统管理员可以安全地委派任务给普通用户,而无需共享 root 密码 - 配置文件:通过
/etc/sudoers控制谁可以通过sudo运行哪些命令,以及在哪些条件下可以运行 - 最小权限原则:
sudo允许用户仅在需要时获得执行特定任务所需的权限 - 环境隔离:
sudo可以在执行时隔离环境变量,避免用户的环境影响系统命令的执行 - 灵活性:
sudo提供了极大的灵活性,管理员可以精细控制每个用户的权限
本例子演示使用centos7.9系统,ubuntu系统和centos有一些不同,可参考下面附加部分
首先查看下配置文件/etc/sudoers,使用visudo命令打开:
#不建议使用vim命令打开,因为会提示只读,还要赋权
#使用visudo编辑保存后会自动校验语法是否正确
visudo #直接输入这个命令即可打开/etc/sudpers文件

上图中也是系统提示的模版,指定用户和用户组可以执行的sudo命令,含义如下:
| 参数 | 说明 |
| root | 表示roo用户 |
| %wheel | 表示wheel用户组,以%开头表示组 |
| ALL | 表示从任何主机都可以执行,保持默认即可 |
| (ALL) | 表示任何人都可以以root身份执行命令,此字段可省略 |
| ALL | 所有命令,NOPASSWD表示无需输入密码 |
因此,图中第一行表示root用户可以在任何主机以任何人身份来执行所有的命令,第2行表示wheel组中的用户可以在任何主机以任何人身份来这记性任何命令,第三行与第二行一样,只是无需输入密码
示例
一、授权用户可执行的命令
1、下面定义用户gongguan可以执行的命令,如图:

(ALL)是可以省略的,如图:

上述命令表示用户gongguan可以在任何主机以任何身份执行useradd和userdel命令,执行未授权的cat /etc/passwd命令就会报错,执行,并提示输入gongguan用户密码,如图:

注:配置命令要使用绝对路径,主要是出于安全考虑,如果用户创建了一个相同名字的脚本,那么就很可能导致执行错误,实际执行的是创建的脚本而不是原始的命令
如果执行命令的时候不需要输入密码,加上字段NOPASSWD即可,如图:

二、授权用户组可以执行的命令
1、定义组可执行的命令,注意,组名前面有个%如图:

2、创建tgroup组和三个用户,并将用户userone和usertwo加入到组中,如下:
groupadd tgroup
useradd -m userone && usermod -a -G tgroup userone
useradd -m usertwo && usermod -a -G tgroup usertwo
useradd -m userthree

3、切换到userone和usertwo,执行cat命令,如图:


登录userthree后无法执行,因此此用户不在tgroup组中,如图:

通过别名定义命令
还可以通过Cmnd_Alias来定义别名,别名中填写命令,别名需要大写
1、下面创建一个别名COMM1,在其中定义命令,然后在ALL后指定即可,如图:

设置禁止用户执行某条命令
1、下图定义用户只能创建用户,但是不能删除用户,如图:

切换到gongguan用户,执行创建和删除命令,可以看到删除失败,如图:

修改sudo会话有效期
sudo 默认在输入一次密码后 5 分钟内不会再次要求密码。5 分钟后,你会再次被要求输入密码,这个有效期可以设置,操作如下:
打开文件/etc/sudoers,找到行:
Defaults env_reset
在这行上面添加如下全局变量,对用户和组都适用:

Defaults timestamp_timeout=2 #超时时间设置为2分钟,2分钟后就需要输入密码了
- timestamp_timeout=0: 0表示每次都要输入密码
- timestamp_timeout=-1:-1表示永远不会超时,只输入一次即可
附加:
ubuntu系统的/etc/sudoers文件中,默认还存在一个%sudo组,如图:

sudo组并没有配置NOPASSWD,因此组内用户如果执行sudo su -来切换到用户也要输入密码,并且sudoers文件还有一个顺序规则,如果在sudo组上面配置了一个用户,无论是否配置了NOPASSWD,在切换到sudo su -的时候,都要输入密码,因为最终以sudo组的配置生效,因为sudo这里需要输入密码,解决办法就是将用户放在sudo组的下方即可,如图:



