菜鸟科技网

su阵列命令如何高效使用?

su 命令 (Switch User / Substitute User)

su 命令用于切换到另一个用户身份,默认情况下是切换到超级用户(root)。

su阵列命令如何高效使用?-图1
(图片来源网络,侵删)

基本语法

su [选项] [用户名]

常用选项

  • -l--login: 最常用、最推荐的选项。

    • 作用: 以登录 Shell 的方式切换用户。
    • 效果: 这会加载目标用户的环境变量(如 .bashrc, .profile 等),工作目录也会切换到目标用户的主目录,这更像是“真正地登录”到那个用户账户。
    • 示例: su -l username 或简写为 su - username
  • -c--command: 执行单个命令后立即退出。

    • 作用: 不需要进入目标用户的交互式 Shell,直接执行指定命令,然后返回到原用户。
    • 示例: su - root -c "apt update" (以 root 用户身份执行 apt update 命令)。
  • --session-command: 与 -c 类似,但不会创建新的会话。

  • -s--shell: 指定要使用的 Shell。

    su阵列命令如何高效使用?-图2
    (图片来源网络,侵删)
    • 作用: 切换用户时,强制使用指定的 Shell,而不是目标用户默认的 Shell。
    • 示例: su -s /bin/zsh username (切换到 username 用户,并使用 zsh 作为 Shell)。
  • -m-p: 保留环境变量

    • 作用: 切换用户后,加载目标用户的环境配置,而是保留当前用户的环境变量,这在某些特殊调试场景下可能有用,但通常不推荐。
  • -f: 快速启动 Shell(主要针对 cshtcsh)。

使用示例

场景 1: 切换到 root 用户(不推荐)

# 输入此命令后,系统会提示你输入 root 用户的密码
su
  • 问题: 这种方式没有加载 root 用户的完整环境,可能会导致一些命令行为异常,不推荐在生产环境中使用。

场景 2: 安全地切换到 root 用户(推荐)

# 输入此命令后,系统会提示你输入 root 用户的密码
su -
# 或者
su -l root
  • 优点: 你会获得一个干净、完整的 root 用户环境,工作目录切换到 /root,所有环境变量都正确加载。

场景 3: 切换到普通用户(切换到 oracle 用户)

# 假设你当前是 root 用户,要切换到 oracle 用户
# 输入此命令后,系统会提示你输入 oracle 用户的密码
su - oracle

场景 4: 以目标用户身份执行单个命令

假设你是一个普通用户,需要重启网络服务,但该命令需要 root 权限。

# 输入此命令后,系统会提示你输入 root 用户的密码
su - root -c "systemctl restart networking"

场景 5: 切换用户并立即退出

当你使用 su - username 切换后,可以通过以下方式返回:

  • 输入 exit 命令。
  • 或使用快捷键 Ctrl + D

su 的缺点

  1. 必须知道目标用户的密码: 如果你需要让一个普通用户拥有管理员权限,你必须告诉他 root 密码,这非常不安全,因为密码会被共享。
  2. 审计困难: 无法精确追踪到是哪个具体的人使用了 root 权限,因为所有知道 root 密码的人执行的操作看起来都一样。
  3. 权限过大: 一旦切换到 root,就拥有了系统的绝对控制权,容易误操作导致系统崩溃。

sudo 命令 (Superuser Do)

sudosu 的现代替代品,它允许授权用户以其他用户(通常是 root)的身份来执行命令,而不需要知道目标用户的密码

基本语法

sudo [选项] [命令]

核心概念与配置

sudo 的强大之处在于其灵活的配置,这些配置都存储在 /etc/sudoers 文件中。强烈建议使用 visudo 命令来编辑此文件,因为它可以检查语法错误,防止你锁住自己。

  • sudoers 文件: 定义了哪些用户可以在哪些机器上以哪些用户的身份运行哪些命令。
  • sudo: 在大多数现代 Linux 发行版(如 Ubuntu, Debian)中,一个用户只要被加入到 sudo 组,就默认拥有了使用 sudo 的权限,可以以 root 身份执行任何命令。

常用选项

  • -u--user: 指定要以哪个用户身份执行命令(默认是 root)。

    • 示例: sudo -u oracle ls -l /home/oracle (以 oracle 用户的身份列出其主目录内容)。
  • -i--login: 模拟一个登录 Shell。

    • 作用: 类似于 su -,它会加载目标用户(通常是 root)的完整环境配置。
    • 示例: sudo -i (切换到 root 的登录 Shell)。
  • -s--shell: 启动一个 Shell。

    • 作用: 与 -i 类似,但通常不会改变工作目录或加载完整的环境变量,只启动一个 Shell。
    • 示例: sudo -s (启动一个 root 用户的 Shell)。
  • -l--list: 列出当前用户被允许执行的命令。

    • 示例: sudo -l (查看自己有哪些 sudo 权限)。
  • -k: “杀死”当前的 sudo 认证缓存,下次使用 sudo 时需要重新输入密码。

  • -K: 与 -k 类似,但会完全删除时间戳文件,强制下次输入密码。

使用示例

场景 1: 以 root 身份执行单个命令

# 普通用户执行此命令,会提示输入当前用户的密码,而不是 root 密码
sudo apt update

场景 2: 以其他用户身份执行命令

# 以 oracle 用户身份执行一个命令
sudo -u oracle whoami
# 输出将是: oracle

场景 3: 切换到 root 的登录 Shell

sudo -i
# 提示输入当前用户的密码后,你会进入一个 root 用户的完整环境
# 输入 exit 返回原用户

场景 4: 编辑一个只有 root 可写的文件

# 普通用户无法直接编辑 /etc/hosts
# 使用 sudo 可以
sudo nano /etc/hosts
# 编辑完成后保存并退出

sudo 的优点

  1. 无需共享密码: 管理员只需配置 /etc/sudoers 文件,普通用户使用自己的密码即可获得授权,提高了安全性。
  2. 精细的权限控制: 可以精确地控制某个用户只能执行特定的命令,而不是所有命令,可以允许用户 webadmin 只能重启 nginx 服务,而不能执行其他危险操作。
  3. 完善的审计日志: sudo 会记录所有执行的命令、执行者、时间、终端等信息,日志通常存放在 /var/log/auth.log/var/log/secure 中,这对于安全审计和故障排查至关重要。
  4. 临时提权: 权限是临时的,通常在一段时间(如15分钟)后失效,需要重新输入密码。

su vs sudo 对比总结

特性 su (Switch User) sudo (Superuser Do)
核心思想 切换到另一个用户,拥有该用户的所有会话和环境。 临时授权执行一个或多个命令,保持自己的原始会话。
密码要求 需要输入目标用户的密码(如 root 密码)。 需要输入当前用户自己的密码。
安全性 较低,需要共享高权限密码,无法审计具体操作人。 ,无需共享密码,权限可精细控制,有详细审计日志。
主要用途 系统管理员登录,或在服务账户间切换。 日常系统管理,让普通用户获得临时高级权限。
环境加载 可通过 -l 选项加载目标用户的完整环境。 通过 -i 模拟登录环境,但默认是当前用户环境。
推荐度 在现代系统管理中不推荐用于日常提权。 强烈推荐作为日常权限管理的标准工具。

结论与最佳实践

在现代 Linux 系统管理中:

  1. 对于日常操作优先使用 sudo,这是最安全、最灵活、最符合现代运维实践的方式,将需要管理的用户加入到 sudo 组,并使用 sudo 来执行需要高权限的命令。

  2. 对于系统维护su 仍然有其价值,尤其是在需要长时间以某个用户(如 oracle, mysql)身份进行操作,或者需要进入一个完全干净的 root 环境进行排错时,但在这种情况下,也推荐使用 sudo -isudo -s 来替代 su -,因为它们同样能提供完整的环境,并且审计日志更清晰。

  • 想临时干个活?用 sudo
  • 想彻底变成另一个人去工作?用 su (但要谨慎)。

对于普通用户来说,你应该学会并习惯使用 sudo,而不是去寻找 root 密码。

分享:
扫描分享到社交APP
上一篇
下一篇