2.3.2 用其他用户的身份执行命令:sudo
上一节中了解了su命令,并且也知道了这个命令存在的缺陷。而sudo则通过一种可配置的方式解决了这个问题。该命令的使用方式是在sudo后跟上需要执行的命令,比如说sudo passwd user1,即使用root的身份修改user1的密码。运行该命令时,系统首先检查/etc/sudoers,判断该用户是否有执行sudo的权限,在确定有执行权限后,系统要求用户输自己的密码,如果密码输入正确,则会以root用户的身份运行passwd user1命令。
在演示sudo命令之前,首先需要设置/etc/sudoers这个配置文件。当然,可以使用一些常见的编辑器来编辑这个文件,比如vi或者vim编辑器等(常见编辑器的使用方法将在第9章中讲解),但是考虑到这个配置文件的重要性,Linux提供了专门编辑这个文件的方式,就是使用命令visudo来编辑这个文件,它的好处是可以在编辑后保存退出时自动检查语法设置,以防止不小心配置错误而造成无法使用sudo命令。该命令如下所示:
- [root@localhost ~]# visudo
- ## Sudoers allows particular users to run various commands as
- ## the root user, without needing the root password.
- ##
- ## Examples are provided at the bottom of the file for collections
- ## of related commands, which can then be delegated out to particular
- ## users or groups.
- ##
- ## This file must be edited with the 'visudo' command.
- ......(
- 略去内容)......
- ## Allow root to run any commands anywhere
- root ALL=(ALL) ALL
- john ALL=(ALL) ALL #
- 复制上一行的内容,并修改用户名为john
- ## Allows members of the 'sys' group to run networking, software,
- ## service management apps and more.
- # %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
- ## Allows people in group wheel to run all commands
- # %wheel ALL=(ALL) ALL
- ## Same thing without a password
- # %wheel ALL=(ALL) NOPASSWD: ALL
- ## Allows members of the users group to mount and unmount the
- ## cdrom as root
- # %users ALL=sbinmount mntcdrom, sbinumount mntcdrom
- ## Allows members of the users group to shutdown this system
- # %users localhost=sbinshutdown -h now
修改完成后,使用用户john登录,然后再尝试使用sudo给别的用户修改密码,系统首先要求输入用户john的密码,验证通过后,就可以设置其他用户的密码了,如下所示:
- [john@localhost ~]$ sudo passwd user1
- [sudo] password for john: #
- 这里输入用户john
- 的密码
- Changing password for user user1.
- New UNIX password: #
- 输入user1
- 的新密码
- Retype new UNIX password: #
- 再次输入user1
- 的新密码
- passwd: all authentication tokens updated successfully.
加入的“john ALL=(ALL)ALL”这一行代表的意思是,john这个用户(第一列)可以从任何地方登录后(第二列的ALL)执行任何人(第三列的ALL)的任何命令(第四列的ALL)。还可以定义某一个组的sudo权限,比如“%john ALL=(ALL)ALL”可以让所有属于john用户组的用户从任何地方登录后执行任何人的任何命令。
正如上面例子所演示的,只需要知道自己的密码就可以使用sudo执行任何命令,这样方便多了。但是每次都需要输入一遍密码也是比较麻烦的事情,想要实现不需要输入密码就可以执行命令,可以在最后一个ALL前添加“NOPASSWD:”,如下所示:
- john ALL=(ALL) NOPASSWD:ALL
这样用户john在使用sudo时就不再需要输入密码了。实际上,将最后一个参数设置为ALL是很不安全的,因为这意味着用户实际拥有了全部的系统权限,和root的权限是一致的,在工作中可以根据用户实际的工作内容定义用户可以sudo执行的命令列表。假设用户john由于工作需要,经常要重启或者关闭服务器,那么就可以进行如下设置:
- john ALL=(ALL) NOPASSWD:sbinshutdown, usrbin/reboot
严格来说,sudo并不是真的切换了用户,而是使用其他用户的身份和权限执行了命令。