【linux】visudo

本文详细解释了visudo命令的作用,用于设置sudoers文件中用户和组的权限,强调了visudo的安全特性。讲解了如何配置不同用户、组在不同主机上的权限,以及如何设置免密执行sudo。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

碎碎念

visudo命令是用来修改一个叫做 /etc/sudoers 的文件的,用来设置哪些 用户 和 组 可以使用sudo命令。并且使用visudo而不是使用 vi /etc/sudoers 的原因在于:visudo自带了检查功能,可以判断是否存在语法问题,所以更加安全

基本使用

使用sudo visudo后会进入一个文件编辑界面,类似于

这些都是说明,直接用 shfit+g 跳到末尾,可以看到root的权限

就像上面说的,visudo的本质就是进入一个文件,在这个文件中决定哪些用户和组可以使用sudo命令,所以就按照这个思路解析一下这个root

用户的情形

root ALL=(ALL) ALL

对于第一个root,这是用户名

第一个ALL,这里应该写的是主机名,用ALL就代表所有的主机都适用这条规则,通常都是设置为ALL,当你处在一个复杂的网络环境中,需要根据不同的主机设置不同的规则的话就可以把ALL改成具体的主机名

比如只对主机 db01 的 myuser 用户允许使用sudo

myuser db01=(ALL) ALL

括号中的ALL代表的用户名,也就是说这里设置了ALL就可以以所有user的身份运行命令

假如我要用myuser2的身份运行命令

sudo -u myuser2 <command>

这样就可以切换到myuser2,然后再执行命令

有时候括号中会写2个ALL

myuser db01=(ALL:ALL) ALL

第二个ALL的意思是可以以任何组的身份运行命令

最后括号外面还有一个ALL,他的意思是可以用sudo运行所有命令

假如你想限定myuser只能够使用sudo运行 /bin/ls 的话,就应该写成

myuser db01=(ALL:ALL) /bin/ls

这就是关于用户能否使用sudo的设定

并且使用sudo经常要我们输入密码,如果希望不用输入密码就可以执行sudo的话

可以使用

myuser ALL=(ALL) NOPASSWD: ALL

在命令前面增加一个 NOPASSWD:即可

组的情形

和用户一模一样,仅仅有一点不同,那就组的名字前面有一个百分号

比如我想设置mygroup可以在所有主机上,作为所有用户和组,在执行所有命令的时候使用sudo

%mygroup ALL=(ALL:ALL) ALL

不需要输入密码: 

%mygroup ALL=(ALL:ALL) NOPASSWD: ALL

<think>好的,我需要解决用户关于在Linux中配置visudo禁止用户重启或关机的问题。首先,用户提到他们通过visudo配置导致用户无法执行这些操作,现在需要找到解决方案。 首先,我应该回忆一下sudoers文件的结构和语法。sudoers文件通过用户、主机、命令的规则来控制权限。用户可能之前在sudoers里给用户赋予了某些权限,但现在需要限制他们执行关机或重启命令。 接下来,我需要确定哪些命令与关机和重启相关。通常,这些命令是/sbin/shutdown、/sbin/reboot、/sbin/poweroff等。所以,解决方案应该是修改sudoers文件,确保目标用户没有执行这些命令的权限。 用户当前的配置可能有类似`username ALL=(ALL) ALL`,这允许用户以root权限执行任何命令,包括关机和重启。要禁止这些,需要从允许的命令列表中排除上述命令。 正确的做法是使用否定命令规则。在sudoers中,可以在命令前加上`!`来表示禁止。例如,如果用户原本有权限执行所有命令,可以修改为允许所有命令,但排除特定的关机命令。不过需要注意,sudoers的规则是最后匹配的,所以顺序很重要。 另外,可能需要检查是否有其他用户组或别名包含了这些命令。例如,如果用户属于某个组,而该组有权限执行这些命令,也需要相应调整。 还需要考虑是否使用了命令别名。可以定义命令别名,比如定义一个包含所有关机相关命令的别名,然后禁止该别名。例如: Cmnd_Alias SHUTDOWN_CMDS = /sbin/shutdown, /sbin/reboot, /sbin/poweroff, /sbin/halt 然后,在用户的权限行中,排除这些命令: username ALL=(ALL) ALL, !SHUTDOWN_CMDS 不过,这里需要注意的是,如果用户的权限行中有ALL,后面再排除某些命令是否有效。因为通常sudoers的规则是后面覆盖前面,但可能需要具体的语法验证。 另一个可能性是用户被明确授予了这些命令的执行权限,需要找到对应的行并删除或注释掉。例如,如果有这样一行: username ALL=(ALL) NOPASSWD: /sbin/shutdown 就需要删除这一行,或者修改为拒绝。 此外,用户可能需要检查是否有多个条目影响同一个命令。例如,可能存在用户组权限或个人用户权限冲突的情况,需要逐一排查。 最后,建议用户使用visudo命令来编辑sudoers文件,因为visudo会检查语法错误,避免配置错误导致无法使用sudo。完成修改后,应该测试用户的权限,确保他们无法执行关机或重启命令,同时其他需要的权限仍然有效。 总结步骤应该是: 1. 使用visudo编辑sudoers文件。 2. 定位到相应用户或组的配置行。 3. 移除或修改允许执行关机/重启命令的条目,添加否定规则。 4. 保存并测试配置是否正确。 需要确保在修改过程中不会破坏现有的必要权限,同时正确应用否定规则来禁止特定命令的执行。</think>### Linux中禁止用户通过visudo配置重启或关机的解决方案 在Linux中,通过`visudo`配置`sudoers`文件可以精确控制用户的权限。若要禁止特定用户执行重启或关机命令,需按以下步骤操作: --- #### **步骤1:使用visudo编辑配置文件** ```bash sudo visudo ``` **注意**:必须使用`visudo`命令,因为它会检查语法错误,避免配置错误导致系统无法使用[^2]。 --- #### **步骤2:定位用户或组的权限配置** 在`sudoers`文件中找到目标用户的配置行。例如,若用户名为`testuser`,配置可能类似: ```bash testuser ALL=(ALL) ALL # 允许执行所有命令 ``` --- #### **步骤3:禁止执行关机和重启命令** 通过**否定命令规则**排除相关命令。关机和重启命令通常包括: - `/sbin/shutdown` - `/sbin/reboot` - `/sbin/poweroff` - `/sbin/halt` 修改用户的权限行,添加否定规则: ```bash testuser ALL=(ALL) ALL, !/sbin/shutdown, !/sbin/reboot, !/sbin/poweroff, !/sbin/halt ``` **解释**: - `!`符号表示禁止执行后续命令。 - 此配置允许`testuser`执行所有命令(`ALL`),但排除了关机和重启相关命令。 --- #### **步骤4(可选):使用命令别名简化配置** 定义命令别名以提高可读性: ```bash Cmnd_Alias SHUTDOWN_CMDS = /sbin/shutdown, /sbin/reboot, /sbin/poweroff, /sbin/halt testuser ALL=(ALL) ALL, !SHUTDOWN_CMDS ``` --- #### **步骤5:保存并测试** 1. 保存文件后退出`visudo`。 2. 以目标用户身份测试权限: ```bash sudo -u testuser sudo shutdown now # 应提示"Sorry, user testuser is not allowed to execute..." ``` --- ### **关键注意事项** 1. **规则顺序**:若用户属于多个组,需确保否定规则生效。通常,后面的规则会覆盖前面的规则。 2. **通配符风险**:避免在命令路径中使用通配符(如`/sbin/*`),可能导致意外权限泄露。 3. **用户组控制**:若需禁止整个用户组,可将配置中的`testuser`替换为`%groupname`。 --- ### **引用配置示例** ```bash # 允许hadoop用户以root身份执行命令,但禁止关机[^2] hadoop ALL=(ALL) ALL, !/sbin/shutdown, !/sbin/reboot ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值