用这些技巧释放 sudo 的力量 ?你应该熟悉 sudo 吧？肯定有过使用的经验。对多数 Linux 用户来说，sudo 就像一个神器，赋予了他们作为 root 用户执行任意命令或切换到 root 用户身份的能力。其实这只掌握了一半的真相。sudo 绝非仅仅只是一条命令，sudo 是一款你可以根据需求和偏好去定制的工具。Ubuntu、Debian 以及其他的发行版在默认的配置下，赋予了 sudo 以 root 用户的身份执行任意命令的权限。这让很多用户误以为 sudo 就像一个魔法开关，瞬间可以获取到 root 权限。比如说，系统管理员可以设置成只有属于特定的 dev 组的部分用户才能用 sudo 来执行 nginx 命令。这些用户将无法用 sudo 执行任何其他命令或切换到 root 用户。如果你对此感到惊讶，那很可能是你一直在使用 sudo，但对其底层的工作原理并没有太多了解。在这个教程中，我并不会解释 sudo 是如何运作的，这个主题我会在另一天讲解。在这篇文章中，你将看到 sudo 的不同特性可以如何被调试和改进。有些可能真的很有用，有些可能完全没什么帮助，但是挺有趣。? 请不要随意去尝试所有提到的改进。如果处理不慎，你可能会遭遇无法运行 sudo 的混乱状态。在大多数情况下，平静阅读并知道这些就好。如果你决定尝试一些改进步骤，请先备份你的系统设置，这样在需要的时候能把事情恢复到正常。1、编辑 sudo 配置时，请始终使用 visudosudo 命令是通过 /etc/sudoers 文件进行配置的。虽然你可以用你最喜欢的 终端文本编辑器 编辑这个文件，比如 Micro、NeoVim 等，但你千万不要这么做。为什么这么说呢？因为该文件中的任何语法错误都会让你的系统出问题，导致 sudo 无法工作。这可能会使得你的 Linux 系统无法正常使用。你只需要这样使用即可：sudo visudo 传统上，visudo 命令会在 Vi 编辑器中打开 /etc/sudoers 文件。如果你用的是 Ubuntu，那么会在 Nano 中打开。这么做的好处在于，visudo 会在你试图保存更改时执行语法检查。这能确保你不会因为语法错误而误改 sudo 配置。好了！现在你可以看看 sudo 配置的一些改变。? 我建议你备份 /etc/sudoers 文件（sudo cp /etc/sudoers /etc/sudoers.bak）。这样，如果你不确定你做了哪些更改，或者你想恢复到默认的 sudo 配置，那你可以从备份文件中复制。2、输入 sudo 密码时显示星号我们的这种输入行为是从 UNIX 系统中继承下来的。当你在终端输入 sudo 密码时，屏幕上不会有任何显示。这种缺乏反馈的现象，往往让新的 Linux 用户怀疑自己的系统已经卡住了。人们常说，这是一项安全功能。或许在上个世纪是这样，但我个人觉得我们没有必要继续这样下去。不过，一些发行版，如 Linux Mint，已经对 sudo 进行了优化，当你输入密码时会显示星号。这样的方式更符合我们的日常经验。如果想让 sudo 输入密码时显示星号，运行 sudo visudo 并找到以下行：Defaults env_reset 然后将其更改为：Defaults env_reset,pwfeedback ? 在某些发行版中，比如 Arch，你可能找不到 Defaults env_reset 这一行。如果这样的话，只需新增一行 Defaults env_reset, pwfeedback 就可以了。现在，当 sudo 需要你输入密码时，你会看到输入的密码变成了星号。✋ 如果你注意到即使密码正确也无法通过一些图形化应用，如软件中心，那就该撤销这项更改。一些较旧的论坛帖子曾提到过此类问题，虽然我自己还未遇到过。3、增加 sudo 密码超时时限当你首次使用 sudo 时，它会要求输入密码。但在随后相当一段时间里，你使用 sudo 执行命令就无需再次输入密码。我们将这个时间间隔称为 sudo 密码超时 （暂且称为 SPT，这是我刚刚编的说法，请不要真的这样称呼 ?）。不同的发行版有不同的超时时间。可能是 5 分钟，也可能是 15 分钟。你可以根据自己的喜好来改变这个设置，设定一个新的 sudo 密码超时时限。像你之前看到的，编辑 sudoers 文件，找到含有 Defaults env_reset 的行，并在此行添加 timestamp_timeout=XX，使其变成如下形式：Defaults env_reset, timestamp_timeout=XX 其中 XX 是以分钟为单位的超时时长。如果你还有其他参数，例如你在上一节中看到的星号反馈，它们都可以在一行中组合起来：Defaults env_reset, timestamp_timeout=XX, pwfeedback ? 同样地，你还可以控制密码重试的次数上限。使用 passwd_tries=N 来修改用户可以输入错误密码的次数。4、在不输入密码的情况下使用 sudo行！你已经增加了 sudo 密码超时时限（或者称之为 SPT。哇塞！你还在坚持这个叫法 ?）。这样很好。我的意思是，毕竟没人愿意每几分钟就输入一次密码。扩大超时时限是一方面，另一方面则是尽可能不去使用它。是的，你没听错。你就是可以在无需输入密码的情况下使用 sudo。从安全角度来看，这听起来似乎很冒险，对吧？的确如此，但在某些实际情况下，你确实会更青睐无密码的 sudo。例如，如果你需要远程管理多台 Linux 服务器，并为了避免总是使用 root，你在这些服务器上创建了一些 sudo 用户。辛酸的是，你会有太多的密码。而你又不想对所有的服务器使用同一的 sudo 密码。在这种情况下，你可以仅设置基于密钥的 SSH 访问方式，并允许使用无需密码的 sudo。这样，只有获得授权的用户才能访问远程服务器，也不用再记住 sudo 密码。我在 DigitalOcean 上部署的测试服务器上就采用了这种方法，用来测试开源工具和服务。好处是这可以按用户进行设置。使用以下命令打开 /etc/sudoers 文件进行编辑：sudo visudo 然后添加如下行：user_name ALL=(ALL) NOPASSWD:ALL 当然，你需要将上面行中的 user_name 替换为实际的用户名。保存文件后，你就可以享受无密码的 sudo 生活了。5、配置独立的 sudo 日志文件查阅 syslog 或 journal 日志，我们可以找到关于 sudo 的所有条目，但若需要单独针对 sudo 的记录，可以专门创建一个自定义的日志文件。例如，选择 /var/sudo.log 文件来存储日志。这个新的日志文件无需手动创建，如果不存在，系统会自动生成。编辑 /etc/sudoers 文件，采用 visudo 命令，并在其中添加以下内容：Defaults logfile="/var/log/sudo.log" 保存该文件后，便可以在其中查看哪些命令在何时、由哪位用户通过 sudo 运行了。6、限制特定用户组使用 sudo 执行特定命令这是一种高级解决方案，系统管理员在需要跨部门共享服务器的多用户环境中会使用。开发者可能会需要以 root 权限运行 Web 服务器或其他程序，但全权给予他们 sudo 权限会带来安全风险。我建议在群组级别进行此项操作。例如，创建命名为 coders 的群组，并允许它们运行在 /var/www 和 /opt/bin/coders 目录下的命令（或可执行文件），以及 inxi 命令（路径是 /usr/bin/inxi 的二进制文件）。这是一个假想情景，实际操作请谨慎对待。接下来，用 sudo visudo 编辑 sudoer 文件，再添加以下行:%coders ALL=(ALL:ALL) /var/www,/opt/bin/coders,/usr/bin/inxi 如有需要，可以添加 NOPASSWD 参数，这样允许使用 sudo 运行的命令就不再需要密码了。关于 ALL=(ALL:ALL) 的详细解读，我们将会在其他文章中进行讲解，毕竟这篇文章已经解释的内容足够多了。7、检查用户的 sudo 权限好吧，这是个小提示，而不是系统调优技巧。如何确认一个用户是否具有 sudo 权限呢？可能有人会说，查看他们是否是 sudo 组的成员。但这并不一定准确，因为有些发行版用的是 wheel 代替 sudo 分组。更佳的方法是利用 sudo 内建的功能，看看用户具有哪种 sudo 权限：sudo -l -U user_name 这将显示出用户具有执行部分命令或所有命令的 sudo 权限。如你所见，我拥有自定义日志文件、密码反馈以及执行所有命令的 sudo 权限。如果一个用户完全没有 sudo 权限，你将看到如下提示：User prakash is not allowed to run sudo on this-that-server. ? 附加内容：输错 sudo 密码时，让系统“侮辱”你这是个我在文章开头提到的“无用”小调整。我想你在使用 sudo 时肯定曾误输过密码，对吧？这个小技巧就是，在你每次输错密码时，让 sudo 抛出随机的“侮辱”。用 sudo visudo 修改 sudo 配置文件，然后添加以下行：Defaults insults 修改后，你可以故意输错密码，测试新的设置。你可能在想，谁会喜欢被侮辱呢？只有粉丝可以以直白的方式告诉你 ?你是如何运用 sudo 的？我知道定制化的可能性无穷无尽，但其实，一般的 Linux 用户并不会去自定义 sudo。尽管如此，我还是热衷于与你分享这些因为你可能会发现一些新奇且实用的东西。? 那么，你有发现什么新的东西吗？请在评论区告诉我。你有一些秘密的 sudo 技巧欢迎和大家分享！（题图：DA/a12900e5-e197-455e-adfc-0b52e4305b91）via: https://itsfoss.com/sudo-tips/作者：Abhishek Prakash 选题：lujun9972 译者：ChatGPT 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
以下是如何将用户添加到 Debian Linux 中的 SUDOERS 组的方法。在 Debian Linux 中，SUDOERS 组在向用户授予管理权限方面发挥着至关重要的作用。将用户添加到 SUDOERS 组使他们能够以 root 权限执行命令，从而为他们提供必要的管理访问权限以在 Debian 系统上执行各种任务。在安装 Debian Linux 的过程中，如果你将 root 帐户的密码保留为空，那么系统中的 创建的第一个用户 将拥有管理权限。但是，如果你设置了 root 密码，那么用户名将不具有 sudo 权限。因此，在使用用户帐户执行管理任务时，你可能会遇到以下类似的错误。<username> is not in the sudoers file. This incident will be reported. 本文旨在提供有关在 Debian 中向 SUDOERS 组添加用户的分步指南，确保你可以有效地管理用户权限和系统安全。如何将用户添加到 Debian 中的 SUDOERS 组要将用户添加到 Debian 中的 SUDOERS 组，请按照以下简单步骤操作：单击“终端”图标或使用快捷键 Ctrl+Alt+T，打开 Debian 系统上的终端。使用以下命令切换到 root 用户：su - 系统将提示你提供 root 密码。输入 root 密码并按回车键。以 root 用户身份登录后，输入以下命令。确保根据你的用户名进行更改。在此示例中，将 arindam 替换为你的用户名。/sbin/addgroup arindam sudo 如果上面的命令无效，还可以使用下面的命令：usermod -aG sudo arindam 按退出离开 root 提示符。注销并重新登录。现在你可以使用你的用户名执行任何管理操作。另一种方法你可以使用与下面相同的命令进入 root 帐户。使用 root 账号登录：su - 然后使用 nano 或 visudo 或任何编辑器打开 /etc/sudoers 文件。nano /etc/sudoers 添加以下行和用户名。根据你的用户名替换 arindam。arindam ALL=(ALL) ALL 保存并关闭文件。然后，注销并重新登录。这应该会给用户名 root 权限。验证 SUDOERS 组成员要验证用户是否已成功添加到 SUDOERS 组，你可以打开一个新的终端窗口并输入以下命令。将 arindam 替换为你添加到 SUDOERS 组的用户的实际用户名。sudo -l -U arindam 如果用户是 SUDOERS 组的成员，你将看到他们拥有的权限列表。这是一个示例，你可以看到我的用户名具有所有访问权限。结束语将用户添加到 SUDOERS 组将授予他们重要的管理权限。在授予用户此类访问权限之前，仔细考虑用户的可信度和责任非常重要。sudo 使用不当可能会导致系统意外损坏或受损。请记住在委派管理权限时要小心谨慎，并定期检查用户权限以维护安全的 Debian 系统。（题图：MJ/c71c2f28-51c7-44c7-87be-af88088bf459）via: https://www.debugpoint.com/add-users-sudoers/作者：Arindam 选题：lkxed 译者：geekpi 校对：校对者ID本文由 LCTT 原创编译，Linux中国 荣誉推出
本文将比较非 root 用户提权为 root 用户的两个 Linux 命令 的区别。su 和 sudo 命令都允许用户执行非特权用户不允许做的系统管理任务，即只有 root 用户能执行的命令。有些人更喜欢 sudo 命令：例如 Seth Kenlon 最近发布的一篇 《在 Linux 上使用 sudo 的 5 个理由》，他在其中详细阐述了 sudo 命令的许多优点。但是，相较于 sudo 命令，我更偏好于 su 命令 来做系统管理工作。在本文中，我比较了这两个命令的区别，并解释了为什么我更喜欢 su 而不是 sudo，但我仍然同时使用这两个命令的原因。过去的系统管理员主要使用 su 命令su 和 sudo 命令是为不同的世界设计的。早期的 Unix 计算机需要全职系统管理员，他们使用 root 用户作为唯一的管理帐户。在这个古老的世界里，有管理员密码的人会在电传打字机或 CRT 终端（例如 DEC VT100）上以 root 用户登录，然后执行一些管理 Unix 计算机的工作。管理员还会有一些非 root 帐户，用于执行一些非 root 的任务，例如编写文档和管理电子邮件等。在这些 Unix 计算机上通常有许多非 root 帐户，他们都不需要完全的 root 访问权限，只需要以 root 权限运行很少的命令，大约 1 至 2 个就可以了。许多系统管理员以 root 用户登录，完成 root 工作，并在任务完成后，退出 root 会话。有时候，系统管理员需要整天以 root 用户来登录，因为 sudo 命令需要键入更多的内容才能运行必要的命令，因此大多数系统管理员很少使用 sudo 命令。sudo 和 su 这两个命令都能够提权为 root 用户，但它们实现的方式大不相同。这种差异是由于它们最初打算用于不同的情况。sudo 命令sudo 命令的初衷是让 root 用户能够让几个非 root 用户访问他们经常需要的一两个特权命令。sudo 命令允许非 root 用户暂时地获得更高权限，来执行一些特权命令，例如添加和删除用户、删除属于其他用户的文件、安装新软件以及管理现代 Linux 主机所需的任何命令。sudo 命令允许非 root 用户访问一两个 需要更高权限 的常用命令，这样可以帮助系统管理员节省来自用户的许多请求，并减少等待时间。sudo 命令不会将用户帐户切换为 root 用户，因为大多数非 root 用户永远不应该拥有完全的 root 访问权限。在大多数情况下，sudo 允许用户执行一两个命令，然后提权就会过期。在这个通常为 5 分钟的短暂的提权时间内，用户可以执行任何需要提权的管理命令。需要继续使用提权的用户可以运行 sudo -v 命令来重新验证 root 访问权限，并将提权时间再延长 5 分钟。使用 sudo 命令还有一些副作用，例如生成非 root 用户使用命令的日志条目及其 ID。这些日志可以在之后作为出现问题的检验，来给用户更多的操作培训。（你以为我会说“问责”用户，对吧？）su 命令su 命令能够将非 root 用户提权到 root 权限 —— 事实上，能让非 root 用户成为 root 用户。唯一的要求是用户知道 root 密码。因为用户已经以 root 权限登录，所以之后的操作就没有限制了。su 命令所提供的提权没有时间限制。用户可以作为 root 执行命令，不需要进行重新验证是否有 root 权限。完成任务后，用户可以执行退出命令 exit，从 root 用户恢复到自己原来的非 root 帐户。su 和 sudo 在使用上的争议和变化最近在 su 与 sudo 的使用上存在一些分歧。真正的系统管理员不会使用 sudo。—— Paul VeneziaVenezia 在他的 InfoWorld 文章 中辩称，对于许多担任系统管理员的人来说，sudo 是一个不必要的工具。他没有花太多时间为这个观点进行解释，他只是把它说成了一个事实。我同意他对于系统管理员的观点，因为我们不需要 sudo 来完成我们的工作。事实上，sudo 使得事情变得更复杂了。然而，时代在“改变”。—— Bob DylanBob Dylan 是对的，尽管他唱的歌不是指计算机（LCTT 译注：Bob Dylan 是美国创作歌手、艺术家和作家，这里指他不是针对于电脑而说的）。自从人手一台的个人计算机时代到来，计算机的管理方式发生了重大变化。在许多环境中，计算机的使用者也是它的管理员，这使得为这些用户提供一些对 root 权限的访问是有必要的。一些现代发行版，例如 Ubuntu 及其衍生版本，只能使用 sudo 命令来执行特权命令。在这些发行版中，用户无法直接以 root 用户身份登录，甚至无法通过 su 切换到 root，因此需要 sudo 命令来允许非 root 用户获得 root 权限。在这一环境中，所有系统管理任务均使用 sudo 来执行。通过锁定 root 帐户并将常规用户帐户添加到“轮子”组（wheel），可以实现此配置，但是这种配置很容易被绕过。接下来，让我们在 Ubuntu 主机或虚拟机上尝试一些小实验吧。我在这里说明一些我的设置，以便你可以根据需要来重现它。我安装的是 Ubuntu 16.04 LTS1，并使用 VirtualBox 将其安装在虚拟机中。在安装过程中，我创建了一个非 root 用户 student，为了简便起见我给这个用户设置了一个简单的密码。以 student 用户身份登录 Ubuntu，并打开终端。查看 /etc/shadow 文件中的 root 条目，其中存储了经哈希的密码。student@ubuntu1:~$ cat /etc/shadow cat: /etc/shadow: Permission denied 可以看到终端拒绝了我们对 /etc/shadow 的访问，因此我们无法查看 /etc/shadow 文件。所有发行版都是如此，以防止非特权用户看到和访问加密的密码，因为非特权用户可能会使用常见的黑客工具来破解这些密码。现在，让我们使用 su - 命令来成为 root 用户。student@ubuntu1:~$ su - Password: <Enter root password – but there isn't one> su: Authentication failure 认证失败的原因是因为 root 帐户没有密码、并且被锁定了。接下来，使用 sudo 命令查看 /etc/shadow 文件。student@ubuntu1:~$ sudo cat /etc/shadow [sudo] password for student: <enter the student password> root:!:17595:0:99999:7::: <截取> student:$6$tUB/y2dt$A5ML1UEdcL4tsGMiq3KOwfMkbtk3WecMroKN/:17597:0:99999:7::: <截取> 在这里，我仅截取了部分结果，只显示 root 和 student 用户的条目。我还缩短了加密密码，以便该条目能显示在一行中。各个字段以冒号（:）分隔，第二个字段是密码。请注意，root 的密码字段是一个感叹号（!），这表明 root 帐户已被锁定，且无法使用。现在，要将 root 帐户变成一个合适的系统管理员，你只需为 root 帐户设置密码。student@ubuntu1:~$ sudo su - [sudo] password for student: <Enter password for student> root@ubuntu1:~# passwd root Enter new UNIX password: <Enter new root password> Retype new UNIX password: <Re-enter new root password> passwd: password updated successfully root@ubuntu1:~# 现在，你可以直接以 root 身份登录到控制台，或者直接使用 su 登录到 root，而不是在每个命令前都加一个 sudo。当然，你也可以在每次想以 root 身份登录时，使用 sudo su -，但这又是何必呢？请不要误解我的意思。像 Ubuntu 这样的发行版及其上下游衍生版非常好，多年来我已经使用了其中的几个。在使用 Ubuntu 和相关发行版时，我做的第一件事就是设置一个 root 密码，这样我就可以直接以 root 身份登录。其他发行版，如 Fedora 及其相关发行版，现在在安装过程中提供了一些有趣的选择。我注意到的第一个 Fedora 版本是 Fedora 34，我在写我的一本即将出版的书时安装了很多次。在安装页面上，可以找到其中一个安装选项，来设置 root 密码。这个新选项允许用户选择“ 锁定 root 帐户 Lock root account ”，就像 Ubuntu 锁定 root 帐户的方式一样。此页面上还有一个选项，允许使用密码以 root 身份远程 SSH 登录到此主机，但这仅在 root 帐户解锁时有效。第二个选项位于允许创建非 root 帐户的页面上。此页面上的选项之一是“ 让此用户成为管理员 Make this user administrator ”。选中此选项后，用户 ID 将添加到一个名为 wheel 组的特殊组中，该组授权该组的成员使用 sudo 命令。Fedora 36 甚至在该复选框的描述中提到了 wheel 组。可以将多个非 root 用户设置为管理员。使用此方法指定为管理员的任何人都可以使用 sudo 命令在 Linux 计算机上执行所有管理任务。Linux 在安装时只允许创建一个非 root 用户，所以其他新用户可以在创建时添加到 wheel 组中。root 用户或其他管理员可以使用文本编辑器或 usermod 命令直接将现有用户添加到 wheel 组。在大多数情况下，今天的管理员只需要执行一些基本任务，例如添加新的打印机、安装更新或新软件，或者删除不再需要的软件。这些 GUI 工具需要 root 或管理密码，并将接受来自管理员用户的密码。在 Linux 上，我是怎么使用 su 和 sudo 的呢我同时使用 su 和 sudo。它们都是我所使用的很重要的系统管理员工具。我不锁定 root 帐户，因为我需要用 root 帐户来运行我的 Ansible 脚本和我编写的 rsbu Bash 程序，来执行备份。这两个程序都需要以 root 身份运行，我编写的其他几个管理 Bash 的脚本也是如此。我使用 su 命令切换到 root 用户，这样我就可以执行这些脚本和许多其他常见的命令。当我需要确定问题和解决问题时，使用 su 命令将我的权限提升到 root 十分有用，因为我不希望 sudo 带来的提权会话超时。当非 root 用户需要执行这些任务时，我使用 sudo 命令，来执行需要 root 权限的任务。我在 sudoers 文件中设置了非 root 帐户，只允许访问完成任务所需的一两个命令。当我只需要运行一两个需要提权的快速命令时，我自己也会使用 sudo 命令。结论实际上只要你把工作完成好了，你使用什么工具都无大碍。你使用的是 Vim 还是 Emacs，是 systemd 还是 SystemV，是 RPM 亦或是 DEB，是 sudo 亦或是 su，在结果上会有什么区别呢？这里的关键在于你应该使用最适合你的工具。Linux 和开源软件的最大优势之一是通常有许多选项可用于我们需要完成的任务。su 和 sudo 都各有长处，如果正确使用的话，两者都是非常安全的。我选择同时使用 su 和 sudo 命令，基于它们的历史功能，因为这对我来说十分有用。对于我自己的大部分工作，我更喜欢 su 命令，因为它与我的工作流程最适配。在评论区分享你喜欢的工作方式吧！本文摘自于我的书《 系统管理员的 Linux 哲学 The Linux Philosophy for Sysadmins （Apress，2018 年）》一书的第 19 章，并经许可后重新发布。via: https://opensource.com/article/22/6/linux-su-vs-sudo-sysadmin作者：David Both 选题：lkxed 译者：chai001125 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
以下是你如何在 Debian、Ubuntu 和其他发行版中修复 “sudo command not found” 错误的方法。有时，当你第一次设置或安装 Linux 发行版 时，你在用 sudo 尝试一些命令时，会出现 “sudo command not found” 的错误。sudo 命令是 “superuser do” 的缩写，它是一个允许用户以管理员权限执行命令的程序。sudo 命令帮助你像管理员用户一样运行程序/命令。此外，用 sudo 运行命令的用户必须是 sudo 组的一部分。你看到这个错误的主要原因是该软件包本身没有安装。然而，大多数现代 Linux 发行版都默认提供了这个功能，但有些则没有。下面是解决这个问题需要遵循的步骤。故障排除 #1首先，安装 sudo 包来解决这个问题。打开一个终端，刷新你的系统，并运行以下命令来安装 sudo。对于 Ubuntu、Debian 和相关发行版：su -apt updateapt install sudo 对于 Arch Linux：pacman -S sudo 对于 Fedora、RHEL 等：su -dnf updatednf install sudo 上述安装完成后，你必须使用以下命令将用户添加到 sudo 组中。usermod -aG sudo <yourusername> 然后从终端运行 visudo，并运行以下行。按 CTRL+O 和 CTRL+X 来保存和退出。退出并再次登录使变化生效。故障排除 #2在做了上述改变之后，如果你仍然收到错误信息，那么请按照以下步骤操作。确保你的 $PATH 变量包含 sudo 可执行文件的正确路径。如果 sudo 已经安装，但 $PATH 不正确，你也会得到这个错误。理想情况下，你的路径应该包含以下所有的路径。echo $PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin 要改变路径变量，使用以下命令。例如，如果 /usr/bin 不存在，那么你可以通过以下方式添加它。export PATH=$PATH:/usr/bin 然后注销并登录查看效果。总结我希望这个指南能帮助你解决 Linux 发行版中的 sudo 错误。表面上的解决方案很简单，真的。如果有帮助，或者如果你有任何问题，请在下面留言。参考via: https://www.debugpoint.com/sudo-command-not-found/作者：Arindam 选题：lkxed 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如何在 sudo 运行的命令中防止使用参数
允许用户使用 sudo 运行命令，但不带命令行参数。在之前的文章，我们学习了如何 通过 sudo 以 root 身份运行目录中的命令。在这篇指南中，我们将学习如何在 Linux 中 防止 sudo 运行的命令使用参数。即我们允许一个用户使用 sudo 运行特权级命令，但是 不带命令行参数。背景介绍你已经知道了，每个命令执行一个特定操作有不同的选项。让我们以 ls 命令为例。ls 命令会罗列文件夹中的内容，对吗？没错。ls 命令附带了一些命令行选项和标志。例如，你可以用 ls 命令的 -a 标志罗列文件夹中的所有内容（包括隐藏文件）。在这份简要指南中，我们将明白如何允许用户通过 sudo 运行 ls 命令，但是不能使用命令行选项或者标志。我讲清楚了吗？接下来让我来展示一下如何做到这点。防止使用 sudo 参数以 root 用户身份编辑 /etc/sudoers 文件：[root@Almalinux8CT ~]# visudo 添加下面一行：user1 ALL=(root) /usr/bin/ls "" 要注意这里 ls 之后的 双引号。双引号会屏蔽用户在给定命令之后输入的参数（比如 ls 命令）。在上面的命令中，user1 能够以 root 身份运行 ls 命令，但是不能使用 ls 命令的选项以及标志。你可以选择其他的指令进行尝试。保存该文件并关闭。现在，以 user1 的身份登录系统，并尝试以管理员身份运行 ls 命令，不要添加任何选项：[user1@Almalinux8CT ~]$ sudo -u root ls -a 或许你会遇到下面的报错：Sorry, user user1 is not allowed to execute '/bin/ls -a' as root on Almalinux8CT. 不过你可以不添加参数来运行 ls 命令：[user1@Almalinux8CT ~]$ sudo -u root ls 防止所有用户使用命令参数上述例子像你展示了如何阻止用户以管理员身份运行带有参数的命令。你是否想要对所有用户应用该规则呢？很简单！只需要在 /etc/sudoers 文件中添加一行：ALL ALL=(root) /usr/bin/ls "" 现在，系统中的所有用户都可以运行不带参数的 ls 命令。想要恢复默认设置，只需要删除最后的双引号，或者删除整行。查看帮助手册，了解更多。$ man sudoers 结论在这份指南中，我们学习了如何允许用户以管理员身份运行命令，但是不能添加任何命令参数。这样可以限制用户误用一些命令行参数。via: https://ostechnix.com/prevent-command-arguments-with-sudo/作者：sk 选题：lkxed 译者：Donkey-Hao 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如何在 Ubuntu 22.04 / 20.04 LTS 中重新设置 sudo 密码
在 Ubuntu 中重新设置已忘记的 root 用户的密码这篇简单的指南将向你解释，如何在 Ubuntu 22.04 和 20.04 LTS 桌面环境中，以及从服务器版本中的 恢复 rescue 模式中重新设置 sudo 密码。介绍在 安装 Ubuntu 时，创建的一个新用户将会带有 sudo 权限，用以执行各种各样的管理任务。如果你的 Ubuntu 系统有多个 sudo 用户，你能够从另外一个 sudo 用户的账号下，轻松地重新设置所忘记的一个 sudo 用户或管理员用户的密码。如果你只有一个 sudo 用户，并且忘记了密码怎么办？没有问题! 从 Ubuntu 的 恢复 rescue 或 单一用户 single user 模式中恢复 sudo 用户密码很容易。虽然这篇指南是在 Ubuntu 22.04 和 20.04 LTS 版本上进行的正式测试，不过，下面给定的步骤对于其它的 Ubuntu 版本和衍生版本来说是相同的。在 Ubuntu 22.04 / 20.04 LTS 中重新设置 sudo 密码首先，启动你的 Ubuntu 系统到 恢复 rescue 模式下，来重新设置一个 sudo 用户的密码，操作如下面的链接所述。如何启动到 Ubuntu 22.04 / 20.04 / 18.04 的 恢复 rescue 模式 或 急救 Emergency 模式现在，进入到 恢复 rescue 模式下，通过运行下面的命令，以读/写的模式挂载根（/）文件系统：# mount -n -o remount,rw / 现在，使用 passwd 命令来重新设置 sudo 用户的密码:# passwd ostechnix 在这里，ostechnix 是 sudo 用户的名称。使用你自己的用户名称来替换掉它。输入两次密码：New password: Retype new password: passwd: password updated successfully 就这样。我们已经重新设置 sudo 用户密码。如果你按照上面链接所述的方法 1 进入到 恢复 rescue 模式，按下 Ctrl+d 组合键来启动到正常模式。或者，你也可以输入下面的任意一个命令来启动到正常模式。# systemctl default 或，# exit 如果你想重新启动系统，而不是启动到正常模式，输入：# systemctl reboot 如果你已经按照上面链接所述的方法 2 进入到 恢复 rescue 模式，输入：# exit 你将返回到 恢复菜单 recovery menu 。现在选择 “ 恢复正常启动 Resume normal boot ”，并按下回车键。在强调一次，选择 “ 确定 OK ” 按钮，并按下回车按键来继续启动到正常模式：现在，你在运行管理命令时可以使用新的 sudo 密码。如果我把用户名称和密码都忘了怎么办？如果你忘记了用户名称，在 恢复 rescue 模式下，你可以很容易地列出你的 Linux 系统中的用户名称，使用目录：# cat etc/passwd 来自我 Ubuntu 22.04 系统的输出示例：[...] ostechnix:x:1000:1000:Ostechnix,,,:/home/ostechnix:/bin/bash [...] 好了，现在，你找到用户名称了。只需要按照上面的步骤来重新设置用户的密码即可。via: https://ostechnix.com/how-to-reset-sudo-password-in-ubuntu-20-04-lts/作者：sk 选题：lkxed 译者：robsean 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
以下是切换到 Linux sudo 命令的五个安全原因。下载 sudo 参考手册获取更多技巧。在传统的 Unix 和类 Unix 系统上，新系统中存在的第一个同时也是唯一的用户是 root。使用 root 账户登录并创建“普通”用户。在初始化之后，你应该以普通用户身份登录。以普通用户身份使用系统是一种自我施加的限制，可以防止愚蠢的错误。例如，作为普通用户，你不能删除定义网络接口的配置文件或意外覆盖用户和组列表。作为普通用户，你无权访问这些重要文件，所以你无法犯这些错误。作为系统的实际所有者，你始终可以通过 su 命令切换为超级用户（root）并做你想做的任何事情，但对于日常工作，你应该使用普通账户。几十年来，su 运行良好，但随后出现了 sudo 命令。对于日常使用超级用户的人来说，sudo 命令乍一看似乎是多余的。在某些方面，它感觉很像 su 命令。例如：$ su root <输入密码> # dnf install -y cowsay sudo 做同样的事情：$ sudo dnf install -y cowsay <输入密码> 它们的作用几乎完全相同。但是大多数发行版推荐使用 sudo 而不是 su，甚至大多数发行版已经完全取消了 root 账户（LCTT 译注：不是取消，而是默认禁止使用 root 用户进行登录、运行命令等操作。root 依然是 0 号用户，依然拥有大部分系统文件和在后台运行大多数服务）。让 Linux 变得愚蠢是一个阴谋吗？事实并非如此。sudo 使 Linux 更加灵活和可配置，并且没有损失功能，此外还有 几个显著的优点。为什么在 Linux 上 sudo 比 root 更好？以下是你应该使用 sudo 替换 su 的五个原因。1. root 是被攻击确认的对象我使用 防火墙、fail2ban 和 SSH 密钥 的常用组合来防止一些针对服务器的不必要访问。在我理解 sudo 的价值之前，我对日志中的暴力破解感到恐惧。自动尝试以 root 身份登录是最常见的情况，自然这是有充分理由的。有一定入侵常识的攻击者应该知道，在广泛使用 sudo 之前，基本上每个 Unix 和 Linux 都有一个 root 账户。这样攻击者就会少一种猜测。因为登录名总是正确的，只要它是 root 就行，所以攻击者只需要一个有效的密码。删除 root 账户可提供大量保护。如果没有 root，服务器就没有确认的登录账户。攻击者必须猜测登录名以及密码。这不是两次猜测，而是两个必须同时正确的猜测。（LCTT 译注：此处是误导，root 用户不可删除，否则系统将会出现问题。另外，虽然 root 可以改名，但是也最好不要这样做，因为很多程序内部硬编码了 root 用户名。可以禁用 root 用户，给它一个不能登录的密码。）2. root 是最终的攻击媒介在访问失败日志中经常可以见到 root 用户，因为它是最强大的用户。如果你要设置一个脚本强行进入他人的服务器，为什么要浪费时间尝试以受限的普通用户进入呢？只有最强大的用户才有意义。root 既是唯一已知的用户名，又是最强大的用户账户。因此，root 基本上使尝试暴力破解其他任何东西变得毫无意义。3. 可选择的权限su 命令要么全有要么全没有。如果你有 su root 的密码，你就可以变成超级用户。如果你没有 su 的密码，那么你就没有任何管理员权限。这个模型的问题在于，系统管理员必须在将 root 密钥移交或保留密钥和对系统的所有权之间做出选择。这并不总是你想要的，有时候你只是想授权而已。例如，假设你想授予用户以 root 身份运行特定应用程序的权限，但你不想为用户提供 root 密码。通过编辑 sudo 配置，你可以允许指定用户，或属于指定 Unix 组的任何用户运行特定命令。sudo 命令需要用户的现有密码，而不是你的密码，当然也不是 root 密码。4.超时使用 sudo 运行命令后，通过身份验证的用户的权限会提升 5 分钟。在此期间，他们可以运行任何管理员授权的命令。5 分钟后，认证缓存被清空，下次使用 sudo 再次提示输入密码。超时可防止用户意外执行某些操作（例如，搜索 shell 历史记录时不小心或按多了向上箭头）。如果一个用户离开办公桌而没有锁定计算机屏幕，它还可以确保另一个用户不能运行这些命令。5. 日志记录Shell 历史功能可以作为一个用户所做事情的日志。如果你需要了解系统发生了什么，你可以（理论上，取决于 shell 历史记录的配置方式）使用 su 切换到其他人的账户，查看他们的 shell 历史记录，也可以了解用户执行了哪些命令。但是，如果你需要审计 10 或 100 名用户的行为，你可能会注意到此方法无法扩展。Shell 历史记录的轮转速度很快，默认为 1000 条，并且可以通过在任何命令前加上空格来轻松绕过它们。当你需要管理任务的日志时，sudo 提供了一个完整的 日志记录和警报子系统，因此你可以在一个特定位置查看活动，甚至在发生重大事件时获得警报。学习 sudo 其他功能除了本文列举的一些功能，sudo 命令还有很多已有的或正在开发中的新功能。因为 sudo 通常是你配置一次然后就忘记的东西，或者只在新管理员加入团队时才配置的东西，所以很难记住它的细微差别。下载 sudo 参考手册，在你最需要的时候把它当作一个有用的指导书。sudo 参考手册via: https://opensource.com/article/22/5/use-sudo-linux作者：Seth Kenlon 选题：lkxed 译者：MjSeven 校对：turbokernel本文由 LCTT 原创编译，Linux中国 荣誉推出
最近的 sudo 版本增加了新的功能，使你能够观察和控制以前隐藏的问题。当你想授予你的一些用户管理权限，同时控制和检查他们在你的系统上做什么时，你会使用 sudo。然而，即使是 sudo'，也有相当多不可控的地方，想想给予 shell 权限的情况就知道了。最近的 sudo 版本增加了一些功能，可以让你看到这些问题，甚至控制它们。例如，你可以启用更详细、更容易处理的日志信息，并记录 shell 会话中执行的每个命令。这些功能中有些是全新的。有些是出现在 1.9.0 甚至更早的版本中的功能。例如，sudo 可以记录终端上发生的一切，即使是在 1.8 版本。然而，系统将这些记录保存在本地，它们很容易被删除，特别是那些记录最有用的地方：Shell 会话。1.9.0 版本增加了会话记录集中收集，因此记录不能被本地用户删除，最近的版本还增加了中继功能，使收集功能更加强大。如果你只知道 sudo 的基础知识，或者以前只使用过 1.8 版本，我建议你阅读我以前的 文章。1、JSON 格式的日志记录我想介绍的第一个新功能是 JSON 格式的日志记录。我是一个日志狂热者（12 年前我就开始在 syslog-ng 项目上工作），而这个功能是我在这里发表文章后引入的第一个功能。启用后，sudo 记录了更多的信息，并且以一种更容易解析的方式进行。传统的 syslog 信息很短，只包含最小的必要信息量。这是由于旧的 syslog 实现的限制。超过 1k 大小的信息被丢弃或截断。Jan 28 13:56:27 localhost.localdomain sudo[10419]: czanik : TTY=pts/0 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash 最近的 syslog 实现可以处理更大的信息量。syslog-ng 默认接受 64k 大小的日志信息（当然，它可以更小或更大，取决于实际配置）。同样的事件，如果以 JSON 格式记录，就会包含更多的信息。更多并不意味着更难处理。JSON 格式的信息更容易被许多日志管理软件应用解析。下面是一个例子：Jan 28 13:58:20 localhost.localdomain sudo[10518]: @cee:{"sudo":{"accept":{"uuid":"616bc9efcf-b239-469d-60ee-deb5af8ce6","server_time":{"seconds":1643374700,"nanoseconds":222446715,"iso8601":"20220128125820Z","localtime":"Jan 28 13:58:20"},"submit_time":{"seconds":1643374700,"nanoseconds":209935349,"iso8601":"20220128125820Z","localtime":"Jan 28 13:58:20"},"submituser":"czanik","command":"/bin/bash","runuser":"root","runcwd":"/home/czanik","ttyname":"/dev/pts/0","submithost":"localhost.localdomain","submitcwd":"/home/czanik","runuid":0,"columns":118,"lines":60,"runargv":["/bin/bash"],"runenv":["LANG=en_US.UTF-8","HOSTNAME=localhost.localdomain","SHELL=/bin/bash","TERM=xterm-256color","PATH=/home/czanik/.local/bin:/home/czanik/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin","MAIL=/var/mail/root","LOGNAME=root","USER=root","HOME=/root","SUDO_COMMAND=/bin/bash","SUDO_USER=czanik","SUDO_UID=1000","SUDO_GID=1000"]}}} 你可以在 sudoers 文件中启用 JSON 格式的日志信息：Defaults log_format=json 你可以从我的 syslog-ng 博客中了解更多关于如何从 sudo 中使用 JSON 格式的日志信息。2、使用 sudo\_logsrvd 集中收集日志1.9.4 中另一个与日志相关的功能是使用 sudo_logsrvd 收集所有 sudo 日志信息（包括失败的）。以前，系统只在 sudo_logsrvd 实际进行记录时记录成功的会话。最后仍然默认通过 syslog 进行记录。为什么这很重要？首先，你可以在一个地方收集任何与 sudo 有关的东西。无论是会话记录还是所有相应的日志信息。其次，它还可以保证正确记录所有与 sudo 有关的事件，因为如果 sudo_logsrvd 无法访问，sudo 可以拒绝执行命令。你可以在 sudoers 文件中通过以下设置启用 sudo_logsrvd 日志记录（当然要替换 IP 地址）：Defaults log_servers=172.16.167.150 如果你想要 JSON 格式的日志信息，你需要在 sudo_logsrvd 配置的 [eventlog] 部分进行如下设置：log_format = json 否则，sudo_logsrvd 使用传统的 sudo 日志格式，并作了简单的修改。它还包括日志来源的主机的信息：Nov 18 12:40:16 centos8splunk.localdomain sudo[21028]: czanik : 3 incorrect password attempts ; HOST=centos7sudo.localdomain ; TTY=pts/0 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash Nov 18 12:40:23 centos8splunk.localdomain sudo[21028]: czanik : HOST=centos7sudo.localdomain ; TTY=pts/0 ; PWD=/home/czanik ; USER=root ; TSID=00000A ; COMMAND=/bin/bash Nov 18 12:40:30 centos8splunk.localdomain sudo[21028]: czanik : command rejected by I/O plugin ; HOST=centos7sudo.localdomain ; TTY=pts/0 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash 3、中继当最初引入 sudo_logsrvd（1.9.0 版）进行会话记录集中收集时，客户端只能直接发送记录。1.9.7 版本引入了中继的概念。有了中继，你可以不直接发送记录，而是将记录发送到多级中间主机，这些中间主机构成你的网络。为什么这很重要？首先，中继使收集会话记录成为可能，即使集中主机由于网络问题或维护而不可用。默认情况下，sudo 在无法发送记录时拒绝运行，所以中继可以确保你可以全天候使用 sudo。其次，它还允许你对网络有更严格的控制。你不需要为所有的主机向中心的 sudo_logsrvd 开放防火墙，而只需要允许你的中继通过。最后，它允许你从没有直接互联网接入的网络中收集会话记录，比如 AWS 私有网络，你可以在网关主机上以中继模式安装 sudo_logsrvd。当你使用中继时，sudo 客户端和中心的 sudo_logsrvd 的配置保持不变。在中继主机上，在 sudo_logsrvd.conf 的 [relay] 部分添加以下一行：relay_host = 172.16.167.161 如果知道通往中心服务器的网络连接有问题，你可以配置中继，在转发记录之前储存它：store_first = true 4、记录子命令你是否曾经想知道在通过 sudo 启动的 shell 会话中发生了什么？是的，会话记录是存在的，但是为了看几个命令的执行情况而看几个小时的记录是很无聊的，也是对时间的巨大浪费。幸运的是，1.9.8 版本引入了子命令日志。现在，只需定期检查你的日志信息，并在发生可疑情况时才观看记录。你甚至不需要一个允许 shell 访问的规则，只需要访问一个编辑器就可以访问 shell。大多数编辑器可以运行外部命令。我最喜欢的编辑器是 JOE，这是我通过 sudo 启动它时可以看到的情况：Aug 30 13:03:00 czplaptop sudo[10150]: czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/joe 不用吃惊，就在一个编辑器里，我生成一个 shell 并从该 shell 中删除一些文件和分区。现在让我们看看当你启用对子命令记录时会发生什么：Aug 30 13:13:14 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/joe Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/sh -c /bin/bash Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/readlink /proc/10889/exe [...] Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/sed -r s@/*:|([^\\\\]):@\1\n@g;H;x;s@/\n@\n@ Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/tty Aug 30 13:13:42 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/id Aug 30 13:13:56 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/ls -A -N --color=none -T 0 /usr/share/syslog-ng/include/scl/ 我省略了几十行以节省一些空间，但你仍然可以看到我启动了一个 shell，bash_profile 执行的命令也可以在日志中看到。你可以在 sudoers 文件中使用以下设置来启用子命令日志：`Defaults log_subcmds` 在传统的 sudo 日志中，你可以从 sudo 进程 ID 看到这些日志正是来自同一个 sudo会话。如果你打开 JSON 格式的日志，如前面所示，sudo 在日志中记录了更多的信息，使之更容易进行分析。5、拦截子命令记录子命令可以消除 sudo 的大部分隐患，但在有些情况下，你不只是想观察正在发生的事情，还想控制事件的流程。例如，你需要给一个用户提供 shell 权限，但仍想阻止他们运行一个特定的命令。在这种情况下，拦截是理想的选择。当然，也有一些限制，比如你不能限制 shell 的内置命令。比方说，who 命令很危险。你可以分两步启用拦截。第一个步骤是启用它，第二个步骤是配置它。在这种情况下，我的用户不被允许运行 who：Defaults intercept czanik ALL = (ALL) ALL, !/usr/bin/who 当我通过sudo 启动一个 root shell 会话并尝试运行 who 时，会发生以下情况：$ sudo -s # who Sorry, user czanik is not allowed to execute '/usr/bin/who' as root on czplaptop. bash: /usr/bin/who: Permission denied 你可以很容易地完全禁用运行 shell：Defaults intercept Cmnd_Alias SHELLS=/usr/bin/bash, /usr/bin/sh, /usr/bin/csh czanik ALL = (ALL) ALL, !SHELLS 这意味着你不能通过 sudo 启动 shell 会话。不仅如此，你也不能从编辑器中执行外部命令。当我试图从 vi 中启动 ls 命令时，就会出现这种情况：$ sudo vi /etc/issue Sorry, user czanik is not allowed to execute '/bin/bash -c /bin/ls' as root on czplaptop. Cannot execute shell /bin/bash Press ENTER or type command to continue 接下来是什么？我希望读了我的文章后，自己尝试一下这些新功能。你可以通过你的软件包管理器在许多 Linux 发行版和 UNIX 变种上安装最新的 sudo，或者使用 Sudo 网站 上的二进制安装程序。这篇文章只是为你提供了一个新的可能性的概述。如果你想了解更多关于这些功能的信息，请访问网站，那里有手册页面，也有 Sudo 博客。via: https://opensource.com/article/22/2/new-sudo-features-2022作者：Peter Czanik 选题：lujun9972 译者：wxy 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
修复在 Ubuntu 上 “Unable to acquire dpkg frontend lock. Are You Root?” 的错误
我假设你对 Linux 很陌生。你按照网上的一些教程，告诉你要安装某个程序或运行某个命令。可能是与服务器有关的东西。但当你运行这个命令时，你遇到了这个错误：E: Could not open lock file /var/lib/dpkg/lock-frontend – open (13: Permission denied) E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root? 或者类似的错误：dpkg: error: required read/write access to the dpkg database directory /var/lib/dpkg E: Sub-process dpkg –set-selections returned an error code (2) E: Executing dpkg failed. Are you root? 这两个错误都在问你同一个问题：你是 root 吗？而这就是这个问题的答案。成为 root。成为 root 以避免这个错误你如何 在 Ubuntu 或 Debian 中成为 root？你使用 sudo 命令。是的，就是这样。无论你在运行什么命令，只要在它前面加上 sudo 即可。sudo your_command 它将要求你输入你的用户账户密码。请记住，当你输入密码时，屏幕上不会显示任何东西，这也没关系。你的系统没有任何问题。在大多数 Linux 系统中，输入密码时不会显示通常的星号或其他东西是一种“安全特性”。只要输入密码，并在密码后按下回车键即可。如果密码输入正确，你现在应该可以运行该命令了。你甚至可以使用这个方便的 Linux 命令行技巧，用 sudo 运行以前的命令：sudo !! 这很简单，而且立即生效，除非你没有 sudo 权限。然后，你会看到一个不同的错误。看到一个 “User is not in sudoer file” 的错误？当你 安装 Ubuntu 时，你必须创建一个用户账户。这个用户被自动授予 sudo 权限，在需要时以 root 身份运行命令。这发生在 Ubuntu 桌面上，而不是服务器上。大多数服务器发行版会有一个单独的 root 账户。如果你单独创建了一个普通账户，你就必须把这个用户添加到 sudoer 中，以便这个普通用户可以使用 sudo。在上面的截图中，我已经创建了这个额外的用户，但没有将其添加到 sudo 组中。这意味着这里的用户 prakash 没有使用 sudo 命令的权限，因此系统抱怨 “prakash is not in sudoers file”。该事件在哪里报告？错误的 sudo 尝试会被添加到系统日志中。它记录了用户名、虚拟终端号、运行命令的位置和运行的命令。这些日志的位置在不同的发行版中有所不同。通常，在 Ubuntu 中你可以在 journalctl 日志或 /var/log/auth.log 文件中找到它，在 Fedora 中可以在 /var/log/audit/audit.log 文件中找到它。如果一个用户不在 sudoer 列表中，你能做什么？当你不能用当前的用户账户使用 sudo 时，你能做什么？首先，验证该用户是否有 sudo 权限。如果没有，你可以有一些选择：以 root 身份登录或切换 root 身份（如果你有 root 密码）。将该用户加入 sudoer 列表 （如果你有其他用户账户的管理或 sudo 权限）。如果你在多用户的 Linux 系统中，自己没有 root 或 sudo 权限，请你的系统管理员授予你的用户 sudo 权限或安装你想安装的应用。这有帮助吗？sudo 是一个非常全面的安全机制，它不仅仅是允许一个普通用户成为 root。它有助于对系统进行审计，了解哪个用户用 sudo 运行了哪个命令。它还可以被配置为只允许某个用户用 sudo 运行某些命令。你不会在桌面 Linux 上看到如此细化的 sudo 配置，在桌面 Linux 上，它被预先配置为允许 sudo 组中的任何用户以 root 的身份运行任何命令。关于 sudo 的更多信息，请参见其他文章。我希望在解决这个经典的初学者问题时，你能对 sudo 命令有一些初步的了解。如果你对这个主题有进一步的问题，请在评论区告诉我。via: https://itsfoss.com/fixed-are-you-root-error/作者：Abhishek Prakash 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
当你刚接触 Linux 时，你会经常遇到这样的建议：永远不要运行 sudo rm -rf /。在 Linux 世界里，更是围绕着 sudo rm -rf 有很多梗。但似乎对于它也有一些混乱的认识。在 清理 Ubuntu 以腾出空间 的教程中，我建议运行一些涉及 sudo 和 rm -rf 的命令。一位读者问我，如果 sudo rm -rf 是一个不应该运行的危险的 Linux 命令，我为什么要建议这样做。因此，我想到了写一篇 Linux 黑话解释，以消除误解。sudo rm -rf 在做什么？让我们按步骤来学习。rm 命令用于 在 Linux 命令行中删除文件和目录。$ rm agatha $ 但是因为有只读的 文件权限，有些文件不会被立即删除。它们必须用选项 -f 强制删除。$ rm books rm: remove write-protected regular file 'books'? y $ rm -f christie $ 另外，rm 命令不能被用来直接删除目录（文件夹）。你必须在 rm 命令中使用递归选项 -r。$ rm new_dir rm: cannot remove 'new_dir': Is a directory 因此最终，rm -rf 命令意味着递归地、强制删除指定的目录。$ rm -r new_dir rm: remove write-protected regular file 'new_dir/books'? ^C $ rm -rf new_dir $ 下面是上述所有命令的截图。如果你在 rm -rf 命令前加入 sudo，你就是在删除具有 root 权限的文件。这意味着你可以删除由 root 用户 拥有的系统文件。所以，sudo rm -rf 是一个危险的 Linux 命令？嗯，任何删除东西的命令都可能是危险的，如果你不确定你正在删除什么。把 rm -rf 命令看作一把刀。刀是一个危险的东西吗？有可能。如果你用刀切蔬菜，那是好事。如果你用刀切手指，那当然是不好的。rm -rf 命令也是如此。它本身并不危险。它只是用来删除文件的。但是，如果你在不知情的情况下用它来删除重要文件，那就有问题了。现在来看看 sudo rm -rf /。你知道，使用 sudo，你是以 root 身份运行一个命令，这允许你对系统进行任何改变。/ 是根目录的符号。/var 表示根目录下的 var 目录。/var/log/apt 指的是根目录的 log 目录下的 apt 目录。按照 Linux 目录层次结构，Linux 文件系统中的一切都从根目录开始。如果你删除了根目录，你基本上就是删除了系统中的所有文件。这就是为什么建议不要运行 sudo rm -rf / 命令，因为你会抹去你的整个 Linux 系统。请注意，在某些情况下，你可能正在运行像 sudo rm -rf /var/log/apt 这样的命令，这可能是没问题的。同样，你必须注意你正在删除的东西，就像你必须注意你正在用刀切割的东西一样。我在玩火：如果我运行 sudo rm -rf /，看看会发生什么呢？大多数 Linux 发行版都提供了一个故障安全保护，防止意外删除根目录。$ sudo rm -rf / [sudo] password for abhishek: rm: it is dangerous to operate recursively on '/' rm: use --no-preserve-root to override this failsafe 我的意思是，人是会打错字的，如果你不小心打了 / var/log/apt，而不是 /var/log/apt（/ 和 var 之间的空格意味着你给出了 / 和 var 目录来删除），你将会删除根目录。（LCTT 译注：我真干过，键盘敲的飞起，结果多敲了一个空格，然后就丢了半个文件系统 —— 那时候 Linux 还没这种故障安全保护。）别担心。你的 Linux 系统会照顾到这种意外。现在，如果你一心想用 sudo rm -rf / 来破坏你的系统呢？你将必须使用它将要求你使用的 -no-preserve-root 选项与之配合。不，请不要自己这样做。让我做给你看看。所以，我在一个虚拟机中运行基本的操作系统。我运行 sudo rm -rf / --no-preserve-root，你可以在下面的视频中看到灯光熄灭（大约 1 分钟）。清楚了么？Linux 有一个活跃的社区，大多数人都会帮助新用户。 之所以说是大多数，是是因为有一些的邪恶坏人潜伏着捣乱新用户。他们经常会建议对初学者所面临的最简单的问题运行 rm -rf /。我认为这些白痴在这种邪恶行为中得到了某种至上主义的满足。我会立即将他们从我管理的论坛和群组中踢出去。我希望这篇文章能让你更清楚地了解这些情况。你有可能仍然有一些困惑，特别是因为它涉及到根目录、文件权限和其他新用户可能不熟悉的东西。如果是这样的话，请在评论区告诉我你的疑惑，我会尽力去解决。最后，请记住。 不要喝酒胡搞 Don’t drink and root 。在运行你的 Linux 系统时要安全驾驶。via: https://itsfoss.com/sudo-rm-rf/作者：Abhishek Prakash 选题：lujun9972 译者：wxy 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出