在很多情况下, 在多人共管主机, 某些用户请求执行某些需要 root 权限的
命令或者干脆就是你忙不过来的时候,你就得让其他人获得 root 权限了。但将 系统的 root 密码告诉很多人显然不是一个好的选择,这往往成为悲剧事件的开 端。那么我们该如何做呢, sudo 命令给我们提供了一个不需要 root 密码也能执 行 root 权限命令的途径。 sudo 命令允许规定的用户能够以在许可范围内以其他用户身份执行规定的 命令。所以, 通过 sudo 命令系统管理员可以分配给普通用户一些合理的“权利”, 让他们执行一些只有 root 或其他特许用户才能完成的任务,比如:运行一些像 mount, halt, shutdown 之类的命令,或者编辑一些系统配置文件,像/etc/mtab, /etc/samba/smb.conf 等。这样以来,就不仅减少了 root 用户的登陆次数和管 理时间,也提高了系统安全性。 sudo 命令有以下特点: sudo 命令能够限制指定用户在指定主机上运行某些命令。 sudo 命令可以提供日志,忠实地记录每个用户使用 sudo 命令做了些什么, 并且能将日志传到中心主机或者日志服务器。 sudo 命令为系统管理员提供配置文件,允许系统管理员集中地管理用户的 使用权限和使用的主机。它默认的存放位置是/etc/sudoers。 sudo 命令使用时间戳文件来完成类似“检票”的系统。当用户执行 sudo 命令 并且输入密码后,用户获得了一张默认存活期为 5 分钟的“入场券”(默认值 可以在编译的时候改变)。超时以后,用户必须重新输入密码。 A) 修改/etc/sudoers 文件 一开始系统默认仅有 root 可以执行 sudo 命令,我们需要通过修改 /etc/sudoers 文件来让别的用户也能够执行 sudo 命令。 用 vi /etc/sudoers 打开/etc/sudoers 文件,在没有改动的情况下文件大约 有 100 多行,在其中找到一行,如下所示: …… ## Next comes the main part: which users can run what software on ## which machines (the sudoers file can be shared between multiple ## systems). ## Syntax: ## ## user MACHINE=COMMANDS ## ## The COMMANDS section may have other options added to it. ## ## Allow root to run any commands anywhere root ALL=(ALL) ALL #找到这一行 # 用户 可登录的主机=(可切换的用户身份列表) 可使用的命令列表 # 表示 root 用户可以在任何地方(远程终端)登录,并且以任意用户身份执行任何命令 ## 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 …… 我们将在这行之后添加一行: ## Allow root to run any commands anywhere root ALL=(ALL) ALL #找到这一行 intern01 ALL=(ALL) ALL #添加这行 #表示 intern01 用户可以在任何地方(远程终端)登录,以任意用户身份执行任何命令 我们试着用 intern01 通过 sudo 来执行一个 passwd 命令来修改 intern02 的 密码: [root ~]# su - intern01 [intern01 ~]$ sudo –u root passwd intern02 #以 root 身份执行 passwd 命令,可以省略 –u 选项,命令是默认转换为 root 身份的 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 intern01: #提供 intern01 密码即可,无需提供 root 密码 更改用户 intern02 的密码 。 新的 密码: 重新输入新的 密码: passwd: 所有的身份验证令牌已经成功更新。 事实上, 这样就给了 intern01 几乎等同于 root 的权限,除非你完全信任 intern01,否则建议你不要这么做,你可以指定 intern01 能够执行的命令: ## Allow root to run any commands anywhere root ALL=(ALL) ALL #找到这一行 intern01 localhost=(root) /sbin/shutdown -h -5 #表示 intern01 用户可以在本地登录,以 root 用户身份执行/sbin/shutdown -5 now 这个命 令,命令得以绝对路径的方式指定 这样一个一个用户指定太过麻烦,也可以按用户组指定: ## Allow root to run any commands anywhere root ALL=(ALL) ALL #找到这一行 %group_p 192.168.56.130=(root) /sbin/shutdown -h -5 #表示从属于 group_p 用户组的 用户可以在 192.168.56.130 主机上登录,以 root 用户身 份执行/sbin/shutdown -5 now 这个命令 事实上,我们甚至可以免除用户输入自己密码的步骤: ## Allow root to run any commands anywhere root ALL=(ALL) ALL #找到这一行 %group_p 192.168.56.130=(root) NOPASSWD:/sbin/shutdown -h -5 #表示从属于 group_p 用户组的 用户可以在 192.168.56.130 主机上登录,以 root 用户身 份执行/sbin/shutdown -5 now 这个命令,并且无需输入用户密码
注意 虽然说如果 sudo 命令允许规定的用户能够以在许可范围内以其他用 户身份执行规定的命令,但是它最常还是用在让普通用户能够以 root 身份执行一些命令; sudo 命令不带-u 选项,默认为切换到 root 用户身份,也即 “sudo fdisk ” 等价于“su –u root fdisk”