了解 Ubuntu 上 sudo 的初学者指南了解 Ubuntu 上 sudo 的初学者指南了解 Ubuntu 上 sudo 的初学者指南了解 Ubuntu 上 sudo 的初学者指南
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

了解 Ubuntu 上 sudo 的初学者指南

在此页

  1. 什么是 sudo?
  2. 任何用户都可以使用 sudo 吗?
  3. 什么是 sudo 会话?
  4. sudo 密码
  5. 一些重要的 sudo 命令行选项
    1. -k 选项
    2. -s 选项
    3. -i 选项

    在 Linux 命令行上工作时遇到过 Permission denied 错误吗?您可能正在尝试执行需要 root 权限的操作。例如,以下屏幕截图显示了当我尝试将二进制文件复制到其中一个系统目录时抛出的错误:

    那么这个问题的解决方案是什么?很简单,使用 sudo 命令。

    运行命令的用户将被提示输入登录密码。输入正确的密码后,操作将成功执行。

    虽然 sudo 无疑是任何使用 Linux 命令行的人都必须知道的命令,但您还应该了解其他一些相关(深入)的详细信息,以便更负责任、更有效地使用该命令。而这正是本文要讨论的内容。

    But before we move ahead, it's worth mentioning that all the commands and instructions mentioned in this article have been tested on Ubuntu with the Bash shell.

    什么是须藤?

    大多数人可能已经知道,sudo 命令用于以提升的权限(通常以 root 身份)执行命令。我们已经在上面的介绍部分讨论了一个这样的例子。但是,如果需要,您可以使用 sudo 作为其他(非 root)用户执行命令。

    这是通过该工具提供的 -u 命令行选项实现的。例如,在下面显示的示例中,我 (himanshu) 尝试重命名其他用户 (howtoforge) 主目录中的文件,但出现权限被拒绝的错误。然后我用 sudo -u howtoforge 尝试了相同的 mv 命令,命令成功了:

    任何用户都可以使用 sudo 吗?

    不可以。对于能够使用 sudo 的用户,与该用户对应的条目应该在 /etc/sudoers 文件中。以下段落 - 摘自 Ubuntu 网站 - 应该更清楚:

    The /etc/sudoers file controls who can run what commands as what users on what machines and can also control special things such as whether you need a password for particular commands. The file is composed of aliases (basically variables) and user specifications (which control who can run what).

    如果您使用的是 Ubuntu,则很容易确保用户可以运行 sudo 命令:您所要做的就是将该用户帐户类型设置为管理员。这可以通过前往系统设置... -> 用户帐户来完成。

    解锁窗口:

    然后选择要更改其帐户类型的用户,然后将类型更改为管理员

    但是,如果您不在 Ubuntu 上,或者您的发行版不提供此功能,您可以手动编辑 /etc/sudoers 文件来进行更改。您需要在该文件中添加以下行:

    [user]    ALL=(ALL:ALL) ALL

    不用说,[user] 应该替换为您授予 sudo 权限的帐户的用户名。这里值得一提的一件重要事情是,官方建议的编辑此文件的方法是通过 visudo 命令——您所要做的就是运行以下命令:

    sudo visudo

    为了让您了解为什么会这样,下面是 visudo 手册的摘录:

    visudo edits the sudoers file in a safe fashion. visudo locks the sudoers file against multiple simultaneous edits, provides basic sanity checks, and checks for parse errors. If the sudoers file is currently being edited you will receive a message to try again later.

    有关 visudo 的更多信息,请访问此处。

    什么是 sudo 会话?

    如果你经常使用 sudo 命令,我相信你会注意到,在成功输入一次密码后,你可以运行多个 sudo 命令而不会提示输入密码。但过了一段时间,sudo 命令再次询问您的密码。

    此行为与您运行的由 sudo 驱动的命令的数量无关,而是取决于时间。是的,默认情况下,sudo 不会在用户输入一次密码后的 15 分钟内询问密码。在这 15 分钟后,系统将再次提示您输入密码。

    但是,如果需要,您可以更改此行为。为此,使用以下命令打开 /etc/sudoers 文件:

    sudo visudo

    然后转到以下行:

    Defaults env_reset

    并在行尾添加以下变量(下面以粗体突出显示)

    Defaults env_reset,timestamp_timeout=[new-value]

    [new-value] 字段应替换为您希望 sudo 会话持续的分钟数。例如,我使用值 40。

    如果您希望每次使用 sudo 命令时都提示输入密码,那么在这种情况下,您可以将值 0 分配给该变量。对于那些希望他们的 sudo 会话永远不会超时的人,您可以指定值 -1。

    请注意,强烈建议不要使用值为 -1 的 timestamp_timeout。

    须藤密码

    正如您可能已经观察到的那样,每当 sudo 提示您输入密码并且您开始输入密码时,什么也没有显示 - 甚至连星号都没有,这通常是常态。虽然这通常没什么大不了的,但有些用户可能出于某种原因希望显示星号。

    好处是这是可能的,而且很容易做到。您所要做的就是更改 /etc/sudoers 文件中的以下行:

    Defaults        env_reset

    到

    Defaults        env_reset,pwfeedback

    并保存文件。

    现在,只要你输入 sudo 密码,星号就会出现。

    一些重要的 sudo 命令行选项

    除了 -u 命令行选项(我们已经在本教程开头讨论过)之外,还有一些其他重要的 sudo 命令行选项值得一提。在本节中,我们将讨论其中的一些。

    -k 选项

    考虑这样一种情况,您在输入密码后刚刚运行了一个由 sudo 驱动的命令。现在,如您所知,默认情况下 sudo 会话保持活动状态 15 分钟。假设在此会话期间,您必须授予某人访问您的终端的权限,但您不希望他们能够使用 sudo。你会怎么做?

    值得庆幸的是,存在一个命令行选项 -k 允许用户撤销 sudo 权限。以下是 sudo 手册页关于此选项的说明:

    -k, --reset-timestamp

    When used without a command, invalidates the user's cached credentials. In other words, the next time sudo is run a password will be required. This option does not require a password and was added to allow a user to revoke sudo permissions from a .logout file.

    When used in conjunction with a command or an option that may require a password, this option will cause sudo to ignore the user's cached credentials. As a result, sudo will prompt for a password (if one is required by the security policy) and will not update the user's cached credentials.

    -s 选项

    有时您的工作可能需要您运行大量需要 root 权限的命令,并且您不想时不时地输入 sudo 密码。此外,您不想通过更改 /etc/sudoers 文件来调整 sudo 会话超时限制。

    在这种情况下,您可能需要使用 sudo 命令的 -s 命令行选项。以下是 sudo 手册页对其的解释:

    -s, --shell

    Run the shell specified by the SHELL environment variable if it is set or the shell specified by the invoking user's password database entry. If a command is specified, it is passed to the shell for execution via the shell's -c option. If no command is specified, an interactive shell is executed.

    所以基本上,这个命令行选项的作用是:

    • 启动一个新的 shell - 至于哪个 shell,参考 SHELL 环境变量。如果 $SHELL 为空,则选择 /etc/passwd 文件中定义的 shell。
    • 如果您还传递命令名称和 -s 选项(例如:sudo -s whoami),那么实际执行的命令是:sudo /bin/bash -c whoami.
    • 如果您不尝试执行任何其他命令(意思是,您只是尝试运行 sudo -s),那么您将获得一个具有 root 权限的交互式 shell。

    这里值得记住的是,-s 命令行选项为您提供了一个具有 root 权限的 shell,但您没有获得 root 环境 - 它是您的 .bashrc 获取的来源。这意味着,例如,在 sudo -s 运行的新 shell 中,执行 whoami 命令仍将返回您的用户名,而不是 root。

    -i 选项

    -i 选项类似于我们刚刚讨论的 -s 选项。但是,存在一些差异。其中一个主要区别是 -i 也为您提供根环境,这意味着您的(用户).bashrc 将被忽略。这就像成为 root 用户而不显式登录为 root 用户一样。更重要的是,您也不必输入 root 用户密码。

    重要提示:请注意,存在一个 su 命令,它还可以让您切换用户(默认情况下,它可以让您成为 root)。此命令要求您输入根密码。为了避免这种情况,你也可以用sudo(sudo su)来执行;在这种情况下,您只需输入您的登录密码。但是,su 和 sudo su 有一些潜在的区别 - 要了解它们以及更多地了解 sudo -i 与它们的比较,请前往此处。

    结论

    我希望现在您至少已经了解了 sudo 背后的基本概念,以及如何调整其默认行为。请尝试我们在此处解释的 /etc/sudoers 调整,还可以通过论坛讨论(在最后一段中链接)以更深入地了解 sudo 命令。

©2015-2025 艾丽卡 support@alaica.com