02.01.2026
4 +2
如何在 Linux 中更改用户:完整指南
Linux 是一个多用户操作系统,用户身份管理是任何系统管理员需要掌握的最基本技能之一。无论您是在管理 VPS 托管环境、配置 Web 服务器,还是在部署后排查文件权限问题,了解如何在 Linux 中切换用户都是必不可少的。
Linux 中的”切换用户”这个短语实际上涵盖了几个不同的操作,每个操作都有自己的工具、风险和最佳实践:
- 在 shell 中切换到另一个账户(例如,从
john到root)进行交互式会话 - 以不同用户身份运行单个命令,无需完全切换会话
- 更改服务或进程运行的用户——对安全加固至关重要
- 更改文件和目录所有权——在迁移、恢复或部署后至关重要
- 修改用户账户属性——重命名用户、更改 UID 或调整组成员身份
本指南深入涵盖所有这些场景,解释何时使用每种方法、如何安全地执行以及要避免哪些错误——这样您可以自信地管理 Linux 用户,而不会破坏权限、服务或访问。
目录
- 切换到另一个用户(交互式 Shell)
- 以另一个用户身份运行单个命令
- 更改服务运行的用户(systemd)
- 使用 chown 更改文件所有权
- 确认您的当前身份
- 修改用户账户属性
- 快速参考速查表
切换到另一个用户(交互式 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 whoami
sudo -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.service
ps -eo user,pid,cmd | grep myservice
检查任何运行中进程的用户
ps -eo user,pid,cmd | grep nginx
ps -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)
查看谁登录到系统
who
w
使用 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 username
RHEL / 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