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命令。该命令如下所示:


  1. [root@localhost ~]# visudo
  2. ## Sudoers allows particular users to run various commands as
  3. ## the root user, without needing the root password.
  4. ##
  5. ## Examples are provided at the bottom of the file for collections
  6. ## of related commands, which can then be delegated out to particular
  7. ## users or groups.
  8. ##
  9. ## This file must be edited with the 'visudo' command.
  10. ......(
  11. 略去内容)......
  12. ## Allow root to run any commands anywhere
  13. root ALL=(ALL) ALL
  14. john ALL=(ALL) ALL #
  15. 复制上一行的内容,并修改用户名为john
  16. ## Allows members of the 'sys' group to run networking, software,
  17. ## service management apps and more.
  18. # %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
  19. ## Allows people in group wheel to run all commands
  20. # %wheel ALL=(ALL) ALL
  21. ## Same thing without a password
  22. # %wheel ALL=(ALL) NOPASSWD: ALL
  23. ## Allows members of the users group to mount and unmount the
  24. ## cdrom as root
  25. # %users ALL=sbinmount mntcdrom, sbinumount mntcdrom
  26. ## Allows members of the users group to shutdown this system
  27. # %users localhost=sbinshutdown -h now

修改完成后,使用用户john登录,然后再尝试使用sudo给别的用户修改密码,系统首先要求输入用户john的密码,验证通过后,就可以设置其他用户的密码了,如下所示:


  1. [john@localhost ~]$ sudo passwd user1
  2. [sudo] password for john: #
  3. 这里输入用户john
  4. 的密码
  5. Changing password for user user1.
  6. New UNIX password: #
  7. 输入user1
  8. 的新密码
  9. Retype new UNIX password: #
  10. 再次输入user1
  11. 的新密码
  12. passwd: all authentication tokens updated successfully.

加入的“john ALL=(ALL)ALL”这一行代表的意思是,john这个用户(第一列)可以从任何地方登录后(第二列的ALL)执行任何人(第三列的ALL)的任何命令(第四列的ALL)。还可以定义某一个组的sudo权限,比如“%john ALL=(ALL)ALL”可以让所有属于john用户组的用户从任何地方登录后执行任何人的任何命令。

正如上面例子所演示的,只需要知道自己的密码就可以使用sudo执行任何命令,这样方便多了。但是每次都需要输入一遍密码也是比较麻烦的事情,想要实现不需要输入密码就可以执行命令,可以在最后一个ALL前添加“NOPASSWD:”,如下所示:


  1. john ALL=(ALL) NOPASSWD:ALL

这样用户john在使用sudo时就不再需要输入密码了。实际上,将最后一个参数设置为ALL是很不安全的,因为这意味着用户实际拥有了全部的系统权限,和root的权限是一致的,在工作中可以根据用户实际的工作内容定义用户可以sudo执行的命令列表。假设用户john由于工作需要,经常要重启或者关闭服务器,那么就可以进行如下设置:


  1. john ALL=(ALL) NOPASSWD:sbinshutdown, usrbin/reboot

严格来说,sudo并不是真的切换了用户,而是使用其他用户的身份和权限执行了命令。