如何在 Linux 中更改用户:完整指南
Linux 是一个多用户操作系统,管理用户身份是任何系统管理员需要掌握的最基本技能之一。无论您是在管理 VPS Hosting 环境、配置 Web 服务器,还是在部署后排查文件权限问题,了解如何在 Linux 中切换用户都是必不可少的。
Linux 中的”切换用户”这个短语实际上涵盖了几个不同的操作,每个操作都有自己的工具、风险和最佳实践:
- 在 shell 中切换到另一个账户(例如,从
john到root)进行交互式会话 - 以不同用户身份运行单个命令,无需完全切换会话
- 更改服务或进程运行的用户 — 对安全加固至关重要
- 更改文件和目录所有权 — 在迁移、恢复或部署后必不可少
- 修改用户账户属性 — 重命名用户、更改 UID 或调整组成员身份
本指南深入涵盖了所有这些场景,解释了何时使用每种方法、如何安全地执行,以及要避免哪些错误 — 这样您就可以自信地管理 Linux 用户,而不会破坏权限、服务或访问。
切换到另一个用户(交互式 Shell)
当您需要以另一个用户身份进行完整的交互式终端会话时——用于系统管理、在不同账户下测试应用程序行为或访问服务账户——Linux 提供两个主要工具:su 和 sudo。
使用 su(切换用户)
su 命令将您当前的用户身份替换为另一个用户:
su - username- 标志(也可写作 -l 或 --login)很重要:它加载目标用户的完整登录环境,包括其主目录、PATH、shell 配置文件和环境变量。如果不使用 - 标志,您将继承当前环境的大部分内容,这可能导致微妙且令人困惑的行为——尤其是在运行脚本或服务时。
直接切换到 root:
su -> 安全提示:在许多现代 Linux 发行版上,root 账户密码默认被禁用(特别是在基于 Ubuntu 的系统上)。在这些情况下,su 到 root 将失败,sudo 是正确的方法。
使用 sudo -i(推荐用于 Root/Admin Shell)
sudo -i这提供了一个root 登录 shell,等同于 su -,但使用您自己的 sudo 权限进行身份验证,而不是需要 root 密码。这是大多数现代发行版上的推荐方法,因为:
- 避免了共享或知道 root 密码的需要
- 所有操作都通过 sudo 审计跟踪记录
- 它遵守您的 sudoers 配置和限制
通过 sudo 使用登录 Shell 切换到另一个用户
sudo -iu username这结合了 -i(登录 shell)和 -u(目标用户),为您提供指定用户的干净登录环境——无需该用户的密码。
以另一个用户身份运行单个命令
通常你不需要一个完整的交互式会话——你只需要以不同的身份执行一个命令。这是权限提升中最常见和最安全的模式。
使用 sudo -u
sudo -u username whoamisudo -u postgres psql第二个例子在数据库管理中非常常见——切换到 postgres 系统用户以访问 PostgreSQL 而无需密码认证。
在清洁登录环境中运行命令
sudo -iu username command_here这确保命令以目标用户的完整环境运行,而不是你当前会话的变量。
以 Root 身份运行命令
sudo systemctl restart nginx这是管理任务的标准模式:运行单个特权命令而不打开 root shell。
更改服务运行的用户 (systemd)
在几乎所有现代 Linux 发行版上,systemd 管理服务。出于安全考虑,每个服务都应该在专用的非特权用户账户下运行,而不是 root。以 root 身份运行服务是一个重大的安全风险——如果服务被破坏,攻击者将获得对整个系统的 root 访问权限。
这在专用服务器和生产 VPS 环境中尤为重要,这些环境中可能同时运行多个服务。
检查当前服务配置
systemctl cat myservice.service在 [Service] 部分中查找 User= 和 Group= 指令:
[Service]
User=www-data
Group=www-data覆盖服务用户(安全方法)
与其编辑原始单元文件(可能在包升级时被覆盖),不如使用 systemctl edit 创建一个 drop-in 覆盖:
sudo systemctl edit myservice.service这将打开一个编辑器,你可以在其中添加:
[Service]
User=myuser
Group=mygroup保存文件,然后应用更改:
sudo systemctl daemon-reload
sudo systemctl restart myservice.service验证服务以正确的用户身份运行
systemctl status myservice.serviceps -eo user,pid,cmd | grep myservice检查任何正在运行的进程的用户
ps -eo user,pid,cmd | grep nginxps -p <PID> -o user,group,cmd> 重要:Linux 不允许你就地更改已运行进程的用户。你必须重新启动进程(或配置服务管理器以在正确的用户下启动它),更改才能生效。
使用 chown 更改文件所有权
文件所有权是 Linux 权限模型的核心部分。在迁移、部署、备份或恢复后,所有权可能会被分配给错误的用户 — 导致权限被拒绝错误、Web 应用程序损坏或数据无法访问。chown 命令是纠正此问题的主要工具。
这是在设置 共享 Web 托管环境或在 VPS 上部署 Web 应用程序时的常见任务。
更改文件的所有者
sudo chown username file.txt更改所有者和组
sudo chown username:groupname file.txt递归更改所有权(谨慎使用)
sudo chown -R username:groupname /var/www/site-R 标志将更改递归应用于所有文件和子目录。谨慎使用 — 将其应用于错误的路径(例如 / 或 /etc)可能会破坏整个系统。
保留符号链接
sudo chown -h username:groupname symlink没有 -h,chown 会跟随符号链接并更改目标文件的所有权,而不是符号链接本身。当您特别想更改符号链接所有权时,使用 -h。
在进行更改之前预览所有权
对于大型目录树,在应用递归 chown 之前,始终先预览:
find /path -maxdepth 2 -printf '%u:%g %pn' | head这显示目录树前两个级别的当前所有者和组,让您在提交更改之前确认更改的范围。
确认您的当前身份
在进行更改之前,始终验证您是谁以及您在什么上下文中操作。这可以防止在错误的帐户下意外进行更改。
检查您的当前用户
whoami获取完整身份信息(用户、组、UID)
id示例输出:
uid=1000(alice) gid=1000(alice) groups=1000(alice),27(sudo),1001(docker)查看谁登录到系统
whow使用 sudo 时检查原始用户
当您使用 sudo 升级时,两个环境变量是相关的:
echo $USER # The current effective user (root)
echo $SUDO_USER # The original user who invoked sudo (e.g., alice)这种区别在脚本中很重要 — $SUDO_USER 告诉您谁实际运行了该命令。
修改用户账户属性
有时”更改用户”意味着修改账户本身:重命名、更改其 UID 或调整组成员资格。这些是永久的系统范围内的更改,可能会影响登录、文件权限和服务访问。
> 最佳实践:在进行账户修改之前,请确保用户已注销且该账户下没有运行的进程。
重命名用户(更改用户名)
sudo usermod -l newname oldname这会更改登录名,但不会自动重命名主目录。要同时移动和重命名主目录:
sudo usermod -d /home/newname -m newname如果用户有一个与其旧用户名同名的主组(这是大多数发行版的默认设置),也要更新组名:
sudo groupmod -n newname oldname更改用户的 UID
sudo usermod -u 2001 username> 关键:更改 UID 后,之前由旧 UID 拥有的所有文件将显示为由未知数字 ID 拥有。您必须立即修复此问题:
sudo find / -user oldUID -exec chown -h username {} ;将 oldUID 替换为之前的数字 UID。此命令搜索整个文件系统中具有旧 UID 的文件,并将其重新分配给新用户名。
将用户添加到组
最常见的用例是向用户授予 sudo 访问权限:
Debian/Ubuntu:
sudo usermod -aG sudo usernameRHEL / AlmaLinux / Rocky Linux:
sudo usermod -aG wheel username-a 标志至关重要——它将用户追加到组中,而不会将其从现有组中删除。省略 -a 将用所有组成员资格替换为仅指定的组。
验证组成员资格
id username快速参考速查表
以下是本指南涵盖的所有用户切换和管理操作的综合参考:
| 任务 | 命令 | |
|---|---|---|
| 切换到另一个用户(登录shell) | su - username | |
| 通过sudo切换到另一个用户 | sudo -iu username | |
| 打开root shell | sudo -i | |
| 以另一个用户身份运行命令 | sudo -u username command | |
| 以postgres身份运行命令 | sudo -u postgres psql | |
| 检查当前用户 | whoami | |
| 检查完整身份和组 | id | |
| 检查原始sudo调用者 | echo $SUDO_USER | |
| 更改文件所有者 | sudo chown username file | |
| 更改文件所有者和组 | sudo chown username:group file | |
| 递归更改所有权 | sudo chown -R username:group /path | |
| 预览目录所有权 | find /path -maxdepth 2 -printf '%u:%g %pn' | |
| 更改服务用户(systemd) | sudo systemctl edit myservice.service | |
| 更改后重新加载systemd | sudo systemctl daemon-reload | |
| 验证进程用户 | `ps -eo user,pid,cmd | grep service` |
| 重命名用户 | sudo usermod -l newname oldname | |
| 移动主目录 | sudo usermod -d /home/newname -m newname | |
| 更改UID | sudo usermod -u 2001 username | |
| UID更改后修复所有权 | sudo find / -user oldUID -exec chown -h username {} ; | |
| 将用户添加到sudo组 | sudo usermod -aG sudo username | |
| 验证组成员身份 | id username |
总结
在Linux中管理用户不是单一操作——它是一系列相关任务的集合,每个任务都有自己的工具和含义:
- 使用
sudo -iu username进行以另一个用户身份的交互式会话(在现代系统上优于su) - 使用
sudo -u username command以不同身份运行单个命令 - 使用
systemctl edit安全地更改systemd服务运行的用户 - 使用
chown在部署、迁移或权限问题后修复文件所有权 - 使用
usermod进行永久账户更改——重命名、UID更改和组管理
理解这些区别有助于您避免常见错误,如破坏服务权限、将自己锁定在文件之外或意外授予过度权限。
如果您正在运行基于Linux的基础设施——无论是Web服务器、数据库还是自定义应用程序堆栈——拥有正确配置的托管环境会使用户管理变得显著更容易。AlexHost提供灵活的VPS控制面板和带cPanel的VPS选项,为您提供完整的root访问权限以及直观的管理界面,因此您可以自信地应用本指南中的所有内容。
