跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / 以超级用户身份使用 sudo 运行命令

以超级用户身份使用 sudo 运行命令

出版日期:2024-12-12
解释

了解 sudo 的基本概念,以及如何以普通用户的身份使用它。

原因

某些命令需要管理员特权。要以管理员权限运行某个命令,可以使用 sudo 命令。

工作量

读完本文最多需要 20 分钟。如果您有具体的问题,可以直接跳转到相应章节。

目标

了解 sudo 的基本概念,并可以针对某些应用场景使用 sudo 运行命令。

要求
  • rootsudo 特权。仅当您是系统管理员时,才拥有这些特权。有关详细信息,请参见 第 1 节 “sudo 基本概念”

  • 需要安装 sudo 软件包。此软件包默认已在 SLE Micro 上提供。

1 sudo 基本概念

了解 sudo 的基本概念及其在 SLE Micro 系统上的工作原理。

sudo 是一个 Linux 命令,用于暂时以另一用户的身份执行程序。它是 substitute user and do 的缩写,借用另一用户(例如 root 用户)的特权。这样,sudo 便可以帮助您完成系统管理任务,且无需以 root 身份登录。

1.1 Linux 系统上的 sudo 概述

作为 Linux 上的普通用户,您拥有的权限已被缩减,但足以完成大多数任务。root 用户是 Linux 超级用户,其身份相当于管理员。

sudo 允许指定的(非 root)用户或一组用户运行特权任务,例如以 root 或另一用户的身份调用系统函数。通过配置文件,系统管理员可以控制哪些用户有权针对哪些任务运行 sudo 命令。

1.2 SLE Micro 系统上的 sudo

出于安全考虑,所有 SLE Micro 系统都将普通用户与 root 用户区分开来。作为普通用户,您无法写入到系统目录,也无法安装程序。任何有权访问 root 口令的用户都可以获取相关特权,然后可能意外或恶意地破坏系统。

例如,您以普通用户身份登录,并意外地浏览到某个恶意网站。攻击者无法偷偷地在您的系统上安装恶意软件,因为您是以普通用户身份登录的,这意味着您不拥有任何管理权限。

如前所述,出于安全原因,不建议一直以 root 用户身份登录。较为安全的做法是始终以普通用户身份登录,并运行以 sudo 开头的受限命令。

注意
注意:sudo 需要管理员权限

在您设置了自己的 root 口令的单用户计算机上,您拥有使用 sudo 命令管理系统以及自行配置 sudo 设置所需的权限。

有关如何配置 sudo 的详细信息,请参见 https://documentation.suse.com/smart/systems-management/html/sudo-configure-superuser-privileges/index.html

在多用户环境中(例如在公司中),sudo 特权由系统管理员管理,并且可以限制 root 用户的权限。即使使用 sudo 执行命令,您也可能无法更改某些系统目录或文件。

1.3 sudo 的工作原理

运行以 sudo 开头的命令时,系统会要求您输入 root 帐户的口令。成功完成身份验证后,将以超级用户特权执行该命令。

根据 sudo 配置,提升的特权会保留特定的一段时间,直到您在同一终端会话中的操作结束为止。如此,在运行另一个 sudo 命令时,您无需再次提供口令。

要使用 sudo 运行命令,请使用以下语法:

> sudo [command]

以下示例说明如何直接在终端中使用 sudo 命令打开 YaST 控制中心。要打开 YaST,需要管理员权限,因此 YaST 只能与 sudo 命令配合使用。

例 1︰ 使用 sudo 打开 YaST 控制中心
> yast
Absolute path to 'yast' is '/usr/sbin/yast', so running it may require superuser privileges (eg. root).1
> sudo yast
[sudo] password for root:2

1

如果仅输入 yast 命令,系统将返回需要 root 特权的消息。

2

如果结合 sudo 启动 yast 命令,系统将提示您输入 root 口令。在输入过程中不会显示口令,无论是明文还是屏蔽字符都不显示。

成功完成身份验证后,YaST 控制中心将打开。

提升的特权会保留特定的一段时间,因此您不必为下一个 sudo 命令再次提供口令。

2 运行以 sudo 开头的命令

作为普通的用户,您可以在命令前加上 sudo 来以 root 身份运行任何命令。系统会提示您提供 root 口令。如果成功完成身份验证,便会以 root 身份运行命令。

运行以 sudo 开头的命令时,系统会要求您输入 root 帐户的口令。成功完成身份验证后,将以超级用户特权执行该命令。

根据 sudo 配置,提升的特权会保留特定的一段时间,直到您在同一终端会话中的操作结束为止。如此,在运行另一个 sudo 命令时,您无需再次提供口令。

过程 1︰ 运行以 sudo 开头的命令

以下过程说明如何使用 sudo 命令将文件复制到只有 root 用户有权编辑的目录。

  1. 打开终端并使用以下命令创建测试文件:

    > touch test.txt
  2. 尝试使用以下命令将文件复制到 /usr/local/bin/ 目录中:

    > cp test.txt /usr/local/bin

    终端返回,例如:

    cp: cannot create regular file '/usr/local/bin/test.txt': Permission denied

    如果未向 sudo 授予所需的特权,则也会出现此消息。

  3. 现在,输入以 sudo 开头的同一命令:

    > sudo cp test.txt /usr/local/bin
  4. 系统会提示您输入 root 口令。请注意,在输入过程中既不会显示明文口令,也不会显示屏蔽字符形式的口令。

    [sudo] password for root:
  5. 成功完成身份验证后,测试文件将复制到 /usr/local/bin

  6. 您已运行第一个 sudo 命令。

3 常见 sudo 命令

在任一命令的前面加上 sudo,可以使用提升的权限运行该命令。您还能以另一用户的身份运行命令,并使用该用户的环境变量。

本节提供通常需要管理特权的常见命令的示例。

使用 sudo 重复上一个命令

要以管理员身份重复上一个命令,请运行 sudo !! 并输入口令。例如,没有管理特权的用户无法在 /etc/ 目录下创建目录。要创建目录,请运行 sudo !!

> mkdir /etc/test/
mkdir: cannot create directory ‘/etc/test/’: Permission denied

> sudo !!
sudo mkdir /etc/test/
[sudo] password for root:

> ls -alrt /etc  | grep test
drwxr-xr-x 1 root root        0 Apr 20 12:48 test
使用 sudozypper 管理软件包

要以管理员身份运行软件包管理命令,请在该命令的前面加上 sudo

> sudo zypper [--GLOBAL-OPTIONS] <COMMAND> [--COMMAND-OPTIONS] [ARGUMENTS]

例如,要从官方软件包储存库安装 Docker CE 容器化平台,请使用 sudo 运行以下命令:

> sudo zypper addrepo https://download.docker.com/linux/suse/docker-ce
            > sudo zypper refresh
            > sudo zypper search docker-ce
            > sudo zypper install docker-ce

对于不会修改系统的 zypper 命令,您无需在其前面加上 sudo;此外,无需提供对信息的访问特权。例如,无需使用 sudo 即可列出系统上已安装软件包的储存库:

> zypper lr
使用 sudosystemctl 管理系统服务

在使用 systemd 管理服务的系统中,您可以将 systemctl 命令与 sudo 结合使用。例如,要重启动 Apache Web Server 服务,请运行:

> sudo systemctl restart apache2

对于不会修改系统的 systemctl 命令,您无需在其前面加上 sudo;此外,无需提供对信息的访问特权。例如,无需使用 sudo 即可显示网络管理器的状态:

> systemctl status NetworkManager
● NetworkManager.service - Network Manager
     Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; vendor preset: disabled)
    Drop-In: /usr/lib/systemd/system/NetworkManager.service.d
             └─NetworkManager-ovs.conf
     Active: active (running) since DAY YYYY-MM-DD HH:MM:SS TIMEZONE; 1h 21min ago
       Docs: man:NetworkManager(8)
   [...]
使用 sudousermod 修改用户帐户

要运行 usermod 命令来修改用户帐户,请使用:

> sudo usermod [OPTION] USERNAME

例如,要将口令失效后永久禁用用户帐户 tux 的天数设置为 30,请运行:

> sudo usermod --inactive 30 tux
使用 sudochown 修改文件和目录所有权

要将文件和目录所有权从当前拥有者更改为新拥有者,请使用:

> sudo chown [OPTION] [OWNER:[GROUP]] FILE

例如,要向 tux 授予 /home/test/tux-files 目录中各文件和子目录的所有权,请运行:

> sudo chown tux /home/test/tux-files/ --recursive

可以运行以下命令来测试所有权更改:

> ls -alrt /home/test/tux-files/ --recursive
以另一用户的身份使用 sudo -s 运行命令

您无需使用 su 命令切换到另一用户,然后再运行命令,而是可以直接使用 sudo -s 命令。sudo -s 命令运行的外壳继承当前用户的环境。sudo -s 命令还提供了一些特权控制措施。

要以另一用户的身份运行命令,请使用:

> sudo -s -u USERNAME COMMAND

默认情况下,该命令从前一用户的目录运行,因为目标用户会继承前一用户的环境。

例如,要以目标用户 tux 的身份以递归方式列出 /home/test/tux-files/ 目录的文件和子目录,请运行:

> sudo -s -u tux ls -alrt /home/test/tux-files/ --recursive

当您以另一用户的身份使用 sudo -s 方法运行某个命令时,该命令将记录到您的历史中。

以另一用户的身份使用 sudo -i 在干净的环境中运行命令

使用 sudo -s 命令时,目标用户将继承前一用户的环境。您可以使用 sudo -i 命令来防止出现这种情况,运行此命令后,目标用户将获得一个干净的环境,并可以在他们自己的 $HOME 目录开始工作。

要以另一用户的身份在干净的环境中运行命令,请使用:

> sudo -i -u USERNAME COMMAND

sudo -i 命令将外壳作为目标用户的交互式登录外壳运行。因此,我们开发了一些外壳启动脚本,例如 .profile.bash_profile 文件。

例如,要以 tux 身份列出 /home/test/tux-files/ 目录的文件和子目录,请运行以下命令:

> sudo -i -u tux ls -alrt /home/test/tux-files/

当您以另一用户的身份使用 sudo -i 方法运行某个命令时,该命令将记录到您的历史中。

4 sudosu 的区别

了解 sudosu 命令的区别及其使用时机。

在 Linux 系统上,您可以在命令的前面加上 sudosu。这两种形式都允许您以 root 身份执行命令。

4.1 sudo 命令的特征

  • sudo 允许您以 root 身份运行命令。根据配置,它不要求您输入 root 口令,而只需输入用户的口令。这样,就不需要与所有其他(普通)用户共享敏感信息。

  • 使用 sudo 配置文件,系统管理员可以控制允许哪些用户使用 sudo 并仅限将其用于特定的任务。

  • sudo 将口令缓存特定的一段时间。在此期限之后,当您运行另一个 sudo 命令时,系统会再次提示您输入口令。

  • 所有使用 sudo 执行的命令会单独记录。日志文件会跟踪日期和时间、运行命令的用户以及命令本身。

4.2 su 命令的特征

  • su 允许您以 root 身份运行命令,但您必须知道 root 口令。

  • 无法将它配置为仅限特定的用户访问或仅限用于特定的任务,以及提升知道 root 口令的任何用户的特权。

  • 将提升用于整个终端会话的特权。只要您不退出会话,系统就不会再次提示您输入口令。

  • 使用 su 执行的命令不会单独记录,因为只能使用用户帐户记录所有操作。