sudo (superuser do) 它允许授权用户作为另一个用户执行命令。另一个用户可以是普通用户或超级用户,大多数时候我们使用它来执行具有更高权限的命令。
sudo 命令与安全策略结合使用,默认安全策略是 sudoers,并且可以通过 /etc/sudoers 文件配置。它的安全政策是高度扩展的,可以制定和分发自己的策略作为插件。
和 su 命令有何不同?
在 GNU / Linux 中,可以使用 su 或者 sudo 命令运行提升特权的命令
su (switch user),使用 su 命令,我们可以切换到 root 用户执行命令,但是这种方法有一些缺点。
- 我们需要与另一个用户共享 root 密码
- 由于根用户是超级用户,我们无法提供受控访问
- 我们无法审计用户正在做什么
sudo 以独特的方式解决了这些问题
- 不需要泄露 root 用户的密码,普通用户使用自己的密码执行更高权限的命令。
- 可以控制 sudo 用户的访问权限,这意味着我们可以限制用户只执行某些命令。
- 记录了 sudo 用户的所有活动。
允许 sudo 访问
让我们将普通用户添加为 sudo 用户。在我的例子中,用户名是 linuxtechi
- 编辑 /etc/sudoers 文件
$ sudo visudo
- 添加以下行以允许 linuxtechi 用户访问 sudo
linuxtechi ALL=(ALL) ALL
在上面的命令中:
- linuxtechi 表示用户名
- 第一个 ALL 表示运行从任何机器 / 终端访问 sudo
- 第二个 (ALL) 表示 sudo 命令允许以任何用户执行
- 第三个 ALL 表示 sudo 命令可以用 root 身份执行
使用提升的权限执行命令
要以更高的权限执行命令,只需在命令前加上 sudo 字,如下所示
$ sudo cat /etc/passwd
执行该命令时,系统将询问 linuxtechi 的密码,而不是 root 用户的密码。
以另一个用户执行命令
除此之外,我们还可以使用 sudo 作为另一个用户来执行命令。例如,以下命令中,linuxtechi 用户以 devesh 用户执行命令
$ sudo -u devesh whoami
[sudo] password for linuxtechi:
devesh
内置命令行为
sudo 的局限性之一是 Shell 内置的命令不能与它一起工作。例如,命令中内置了历史记录,如果您尝试使用 sudo 执行此命令,则 not found 错误将报告如下
$ sudo history
[sudo] password for linuxtechi:
sudo: history: command not found
为了克服上述问题,可以访问 root shell 并从那里执行任何命令,包括 shell 内置的命令。
$ sudo bash
执行此命令后,您将观察到提示符号变为 # 字符。
以 sudo 用户执行先前的命令
假设您想要以更高的权限执行前面的命令,那么下面的技巧将是有用的
$ sudo !4
上面的命令将以更高的权限执行历史记录中的第 4 个命令。
如果您想使用 sudo 命令以 root 权限执行先前命令,则使用以下命令
$ sudo !!
sudo 命令与 vim
很多时候,我们编辑系统的配置文件,在保存时,我们意识到我们需要根权限来做这件事。因为这样我们可能会失去我们的变化。没有必要恐慌,我们可以在 Vim 中使用以下命令
:w !sudo tee %
在上面的命令中:
- Colon (😃 indicates we are in Vim’s ex mode
- Exclamation (!) mark indicates that we are running shell command
- sudo and tee are the shell commands
- Percentage (%) sign indicates all lines from current line
使用 sudo 执行多个命令
我们可以使用它执行多个命令,只需使用分号 (😉 分隔命令,如下所示
$ sudo -- bash -c 'pwd; hostname; whoami'
在上面的命令中:
- Double hyphen (–) stops processing of command line switches
- bash indicates shell name to be used for execution
- Commands to be executed are followed by –c option
在没有密码的情况下运行 sudo 命令
当第一次执行 sudo 命令时,它将提示输入密码,默认情况下,密码将缓存 15 分钟。但是,我们可以覆盖此行为并使用 NOPASSWD 关键字禁用密码身份验证,如下所示
linuxtechi ALL=(ALL) NOPASSWD: ALL
限制用户执行某些命令
为了提供受控访问,可以限制 sudo 用户只执行某些命令。例如,只允许执行 echo 和 ls 命令
linuxtechi ALL=(ALL) NOPASSWD: /bin/echo /bin/ls
使用 sudo 命令将行或文本字符串附加到文件中
在某些情况下,我们需要在具有 sudo 权限的本地用户的现有文件中追加几行
$ echo ‘text-string’ | sudo tee -a <path_of_file>
示例如下所示
pkumar@linuxtechi:~$ echo "deb http://ftp.de.debian.org/debian buster main contrib" | sudo tee -a /etc/apt/sources.list
deb http://ftp.de.debian.org/debian buster main contrib
pkumar@linuxtechi:~$
也可以使用如下方法
sudo sh -c 'echo "deb http://ftp.de.debian.org/debian buster main contrib" >> /etc/apt/sources.list'
深入了解 sudo
让我们挖掘更多关于 sudo 命令的信息来深入了解它。
$ ls -l /usr/bin/sudo
-rwsr-xr-x 1 root root 145040 Jun 13 2017 /usr/bin/sudo
如果仔细观察文件权限,sudo 上的 setuid 位是启用的。当任何用户运行这个二进制文件时,它将使用拥有该文件的用户的特权运行。在本例中,它是 root 用户。
当不使用 sudo 命令执行 id 命令时,会显示 linuxtechi 用户的 id。
$ id
uid=1002(linuxtechi) gid=1002(linuxtechi) groups=1002(linuxtechi)
当使用 sudo 命令执行 id 命令时,会显示 root 用户的 id。
$ sudo id
uid=0(root) gid=0(root) groups=0(root)