Linux-sudo-command-tips

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

1) 编辑 /etc/sudoers 文件

$ sudo visudo

2) 添加以下行以允许 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)

我的开源项目

酷瓜云课堂-在线教育解决方案


鸠摩智首席音效师
472 声望9 粉丝

身强体健,龙精虎猛的活着。