Linux 下使用 sudo 命令,可以让普通用户也能执行一些或者全部的 root 命令。本文就对我们常用到 sudo 操作情景进行简单分析,通过一些例子来了解 sudo 命令相关的技巧。
情景一:用户无权限执行 root 命令
普通用户登录 shell 之后,如果自身没有权限访问某个文件或执行某个命令时,若该用户获得root授权,那么就可以在需要执行的命令之前加上 sudo,临时切换到root用户的权限,完成相关的操作。在sudo于1980年前后被写出之前,一般用户管理系统的方式是利用su切换为超级用户。但是使用su的缺点之一在于必须要先告知超级用户的密码,而sudo使一般用户不需要知道超级用户的密码即可获得权限。
Ubuntu的sudo与su命令使用与开启root帐户
sudo: sorry, you must have a tty to run sudo
那么哪些用户可以临时获得 root 权限呢?这就需要在 /etc/sudoers 文件中进行配置:
授权给单个用户:
# User privilege specification
guohl ALL=(ALL) ALL
上面这个例子中:
guohl:允许使用 sudo 的用户名
ALL:允许从任何终端(任何机器)使用 sudo
(ALL):允许以任何用户执行 sudo 命令
ALL:允许 sudo 权限执行任何命令
如果我们想让用户 test 只能在本主机(主机名为guohl-pc)以 root 账户执行/bin/chown、/bin/chmod 两条命令,那么就应该这样配置:
# User privilege specification
test guohl-pc=(root) /bin/chown,/bin/chmod
如果test 登录之后运行 sudo 命令,不满足上面三个条件命令均失败。
授权给用户组:
# Allow members of group sudo to execute any command
# (Note that later entries override this, so you might need to move it further down)
%sudo ALL=(ALL) ALL
和授权给单个用户类似,只不过将用户名在这里换成%组名,所有在该组中的用户都按照此规则进行授权。对于该例,所有在 sudo 组内的用户都有在任何终端(第一个ALL)、以任何用户(第二个ALL)、执行任何命令(第三个ALL)的权限,查看 /etc/group 文件可以知道哪些用户属于 sudo 组。
举例:
如果当前帐号在 /etc/sudoers 文件中被授予 sudo 的权限,那么你就可以将任何 root 命令作为 sudo 命令的参数,使用 root 权限来执行该命令。举例来说,挂载一个文件系统只能由 root 来执行,但是一个普通用户也可以使用 sudo 来挂载:
$sudo mount /dev/sda7 /mnt
[sudo] password for guohailin:
首次使用会要求你输入当前用户的密码,系统确实输入正确即以 root 权限来执行 mount 命令,接下来一段时间(默认为5分钟)再次使用 sudo 命令就不需要输密码了。
情景二:vim 编辑后发现忘记使用 sudo
我们经常会遇到这样的一个囧境:使用 vim 对某个文件进行编辑,编辑完之后,按 ESC 之后回到普通模式,再按 :wq 准备保存退出时,发现没有权限对该文件进行修改,我们在使用 vim 命令时忘记在前面加 sudo 了。我就经常出现这种问题,之前的做法是只能不保存强退,再加上 sudo 重新编辑。
但是今后我们再也不需要用这么愚蠢的做法了,我们可以在 vim 的普通模式下,按 :w !sudo tee % ,这样就可以 root 权限来保存文件了,你也无需因为自己一时忘记加个 sudo 而沮丧懊恼了!
情景三:执行 root 命令忘记加 sudo
我们还会遇到这样稍微好一点的情形:输入一个长长的命令,按 Enter 之后出现无权限操作,因为我们忘记加 sudo 了。大多人的做法是按 ↑ 回到上一条命令,在该命令之前加上 sudo,再执行该命令。
以后,我们无需这样了,只要输入 sudo !! 即可,这里的 !! 代表上一条命令。如:
$ head -n 4 /etc/sudoers
head: cannot open `/etc/sudoers' for reading: Permission denied
$ sudo !!
sudo head -n 4 /etc/sudoers
# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#