蚊章汇 - sudo
type: channel
link: https://linuxcn.bwsl.wang/tag/sudo/
items: Linux 用户的 7 个 sudo 技巧和改进
items: 在 Debian 中将用户添加到 SUDOERS 组的 2 种方法
items: Linux 中的 su 和 sudo 命令有什么区别？
items: 如何修复：“sudo Command Not Found” 错误
items: 如何在 sudo 运行的命令中防止使用参数
items: 如何在 Ubuntu 22.04 / 20.04 LTS 中重新设置 sudo 密码
items: 在 Linux 上使用 sudo 命令的 5 个理由
items: 2022 年 5 个新 sudo 功能
items: 修复在 Ubuntu 上 “Unable to acquire dpkg frontend lock. Are You Root?” 的错误
items: Linux 黑话解释：什么是 sudo rm -rf？为什么如此危险？

Linux 用户的 7 个 sudo 技巧和改进
type: item
date: 2023-12-15T07:23:54+08:00
description: 用这些技巧释放 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_res…

在 Debian 中将用户添加到 SUDOERS 组的 2 种方法
type: item
date: 2023-07-02T01:40:00+08:00
description: 以下是如何将用户添加到 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中国 荣誉推出

Linux 中的 su 和 sudo 命令有什么区别？
type: item
date: 2022-12-15T01:12:22+08:00
description: 本文将比较非 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 …

如何修复：“sudo Command Not Found” 错误
type: item
date: 2022-11-23T17:56:00+08:00
description: 以下是你如何在 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 运行的命令中防止使用参数
type: item
date: 2022-10-05T06:41:20+08:00
description: 允许用户使用 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 密码
type: item
date: 2022-05-29T16:34:00+08:00
description: 在 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 命令的 5 个理由
type: item
date: 2022-05-25T19:29:28+08:00
description: 以下是切换到 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…

2022 年 5 个新 sudo 功能
type: item
date: 2022-02-24T20:42:00+08:00
description: 最近的 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_l…

修复在 Ubuntu 上 “Unable to acquire dpkg frontend lock. Are You Root?” 的错误
type: item
date: 2021-10-30T17:24:58+08:00
description: 我假设你对 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？为什么如此危险？
type: item
date: 2021-09-23T23:35:00+08:00
description: 当你刚接触 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 /。我认为这些白痴在这种邪恶行为中得到了某种至上主义的满足。我会立即将他们从我管理的论坛和群组中…