1. 核心概念:用户身份
  2. su 命令详解
    • 基本用法
    • 高级用法(选项)
    • 安全风险
  3. sudo 命令详解
    • 为什么需要 sudo
    • 基本用法
    • sudo 的核心优势
  4. ps 命令详解
    • 为什么需要 ps
    • 基本用法(查看当前用户进程)
    • 进程树(ps auxf
    • 关键选项详解
  5. pssu/sudo 的结合使用
    • 查看当前用户的进程
    • 查看其他用户的进程(需要 sudo
    • 切换到 root 后查看所有进程
  6. 总结与最佳实践

核心概念:用户身份

在 Linux 系统中,每个进程都在特定的用户身份下运行,这决定了该进程对文件、系统资源的访问权限。

ps su 风格 教程
(图片来源网络,侵删)
  • 普通用户:权限有限,只能操作自己的文件和被授权的资源。
  • 超级用户:用户名通常是 root,拥有系统的最高权限,可以执行任何操作,包括修改系统文件、停止服务等。

susudo 的核心目的,就是让你能够临时地以其他用户(通常是 root)的身份来执行命令。


su 命令详解 (Switch User)

su 的全称是 "Switch User",用于从一个用户切换到另一个用户。

基本用法

# 切换到 root 用户
su
# 或者更明确地
su -
# 切换到指定用户,'oracle'
su oracle

命令执行后的行为:

  1. su:执行后,系统会提示你输入目标用户的密码,如果你不指定用户,默认是 root
  2. su -su -l:这是一个“登录式切换”,它不仅切换了用户身份,还会加载目标用户的环境变量(如 .bashrc, .profile 等),让你感觉像是真正登录到了那个用户账户。强烈推荐使用 su -,因为它能提供一个干净、独立的环境,避免环境变量污染导致的问题。

退出:切换后,你可以通过输入 exit 命令或按 Ctrl + D 返回到原来的用户身份。

ps su 风格 教程
(图片来源网络,侵删)

高级用法(选项)

  • -l:登录式切换(如上所述)。
  • -c只执行一条命令,然后立即返回到原用户,这在脚本中非常有用。
    # 以 root 身份执行 'apt update',然后立即退出
    su - root -c "apt update"
  • -s:指定目标用户的Shell
    # 以 oracle 用户身份,但使用 /bin/sh 而不是默认的 /bin/bash
    su - oracle -s /bin/sh

安全风险

su 的主要安全风险在于:一旦你切换到了 root,你就拥有了 root 的全部权限,如果你不小心运行了一个恶意脚本或命令,可能会对整个系统造成毁灭性破坏。root 的密码如果泄露,任何知道密码的人都能获得最高权限。


sudo 命令详解 (Superuser Do)

sudo 提供了一种更安全、更精细的权限控制方式。

为什么需要 sudo

sudo 的设计哲学是:root 的密码不应被共享,系统管理员通过配置文件(/etc/sudoers)来授权哪些用户可以以 root 身份执行哪些命令。

  • 安全性:用户使用自己的密码来执行 sudo 命令,而不是 root 的密码。
  • 可追溯性sudo 会记录详细的日志(/var/log/auth.log/var/log/secure),记录了谁在什么时间执行了什么命令,便于审计。
  • 最小权限原则:可以精确地授权用户执行特定的命令,而不是无限制的 root 权限。

基本用法

# 以 root 身份执行命令
sudo command
# 示例:安装一个软件包
sudo apt install vim
# 切换到 root 用户(保持环境)
sudo su
# 切换到 root 用户(登录式环境,等同于 su -)
sudo su -

执行过程:当你第一次使用 sudo 时,系统会提示你输入当前用户的密码,之后的一段时间内(默认通常是15分钟),再次使用 sudo 可能不需要再次输入密码。

ps su 风格 教程
(图片来源网络,侵删)

sudo 的核心优势

  1. 不共享 root 密码root 密码只由少数管理员掌握,普通用户无需知道。
  2. 精细授权:可以在 /etc/sudoers 中配置,例如允许 www-data 用户只重启 nginx 服务,而不能做其他任何事情。
  3. 审计日志:所有 sudo 操作都有据可查,安全性极高。

ps 命令详解 (Process Status)

ps 用于查看当前系统正在运行的进程。

为什么需要 ps

当你想了解系统在做什么时,ps 是你的第一选择,你可以看到:

  • 有哪些进程在运行。
  • 每个进程的 ID (PID)。
  • 进程属于哪个用户。
  • 进程占用了多少 CPU 和内存资源。

基本用法(查看当前用户进程)

在终端直接输入 ps,会显示当前终端会话中运行的进程。

ps

输出可能像这样:

  PID TTY          TIME CMD
12345 pts/0    00:00:00 bash
12389 pts/0    00:00:00 ps
  • PID: 进程ID
  • TTY: 终端类型
  • TIME: 已占用的 CPU 时间
  • CMD: 命令名称

进程树(ps auxf

ps 最强大的用法之一是结合多个选项来查看所有进程及其关系。

ps auxf
  • a: 显示所有终端下的所有进程,包括其他用户的进程。
  • u: 以用户为中心的格式显示,包含用户名、CPU、内存等。
  • x: 显示没有控制终端的进程(如系统服务)。
  • f: 用 ASCII 字符树状结构显示进程的父子关系,非常直观。

示例输出(部分):

USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.1  19356  9400 ?        Ss   5月30   0:07 /sbin/init
root         321  0.0  0.0      0     0 ?        I<   5月30   0:00 [kthreadd]
...
root         567  0.0  0.1  10444  8756 ?        Ss   5月30   0:00 /usr/sbin/sshd -D
root        1023  0.0  0.0   9860  3344 pts/0    Ss+  10:15   0:00  \_ -bash
myuser      1234  0.0  0.0  12128  2892 pts/0    R+   10:16   0:00      \_ ps auxf

从这个输出中,你可以清晰地看到 sshdinit 的子进程,而你的 bash 终端是 sshd 的子进程,ps 命令又是 bash 的子进程。

关键选项详解

  • -e: 显示所有进程,等同于 -A
  • -l: 使用长格式显示,更多信息。
  • -f: 完整格式显示,包括 PPID (父进程ID)。
  • --forest: 和 -f 类似,但用更漂亮的树状图显示层级关系。

pssu/sudo 的结合使用

这是 ps 命令最常见的高级应用场景。

查看当前用户的进程

这是最简单的场景,无需任何特殊权限。

# 查看当前用户的所有进程
ps u
# 查看当前用户的进程树
ps u --forest

查看其他用户的进程(需要 sudo

普通用户无法看到其他用户的进程详细信息(出于隐私和安全考虑),如果你需要查看 nginx 用户的进程,你需要 sudo

# 错误示范(普通用户可能看不到)
ps -u nginx
# 正确示范(使用 sudo)
sudo ps -u nginx

或者,使用 ps aux 并用 grep 过滤:

sudo ps aux | grep nginx

切换到 root 后查看所有进程

这种方法比较“暴力”,会切换到一个全新的 root 环境,然后查看所有进程。

# 1. 切换到 root 用户
sudo su -
# 2. 查看所有进程及其树状关系
ps auxf
# 3. 完成后,退出 root 环境
exit

注意:这种方法虽然直观,但不推荐,因为它会暴露整个 root 环境,增加了误操作的风险。sudo ps auxf 是更安全、更推荐的方式


总结与最佳实践

特性 su sudo
核心目的 切换用户身份 以其他用户身份执行命令
密码使用 需要输入目标用户的密码 需要输入当前用户的密码
环境切换 su - 提供新环境 不切换环境,仅在命令执行时提权
安全性 较低,共享 root 密码 ,不共享密码,有审计日志
可审计性 极佳,所有操作都有日志记录
推荐场景 脚本中需要完全切换到某个用户,或进行系统管理任务时 日常系统管理和绝大多数情况下的首选

最佳实践

  1. 优先使用 sudo:在绝大多数情况下,使用 sudo command 来执行需要管理员权限的命令,这是最安全、最现代的做法。
  2. 谨慎使用 su -:只有在需要长时间、多次以 root 身份工作,或者脚本逻辑复杂必须完全切换环境时,才使用 su -
  3. 善用 ps auxf:当你需要排查问题、监控系统负载时,ps auxf 是你的好朋友,它能让你对进程关系一目了然。
  4. 结合 grep:当系统进程非常多时,使用 ps aux | grep <keyword> 来快速定位你关心的进程。
  5. exit:使用 susudo su 切换后,任务完成后一定要记得用 exit 返回,避免长时间停留在高权限状态下。

掌握 su, sudops 是迈向 Linux 高手的必经之路,希望这篇详细的教程能帮助你彻底理解它们!