如何更改我的用户名?

一段时间前,当我安装Ubuntu时,我选择了一个相当愚蠢的用户名作为我的账户,我不想再使用它了。
我如何更改这个用户名(包括我的主目录和终端中的名称),而不会丢失应用程序的设置? 我如何保留各种身份验证(例如电子邮件、SSH、GPG等)的权限和密钥? 如果我更改了用户名,可能会丢失哪些设置?

1为什么我们不能导航到 /usr/share/applications/users.desktop >> 点击要更改名称的用户 >> 点击更改用户名 >> 更改名称 >> 点击确定。我认为,这将是更改用户名最简单的方法,不是吗? - Anand
8个回答

Unix-like操作系统将用户名与用户身份解耦,因此您可以安全地更改名称而不影响ID。所有权限、文件等都与您的身份(uid)而非用户名相关联。
要管理用户数据库的每个方面,您可以使用usermod工具。
要更改用户名和用户组名(最好在未登录状态下执行此操作):
sudo usermod -l newUsername oldUsername
sudo groupmod -n newUsername oldUsername

这个操作不会改变主文件夹的名称。
要更改主文件夹,请使用
sudo usermod -d /home/newHomeDir -m newUsername

在你更改了用户名之后。

例如,你可以注销,切换到控制台(Ctrl+Alt+F1),然后使用sudo su -命令成为真正的root用户(而不是sudo -s,其中$HOME仍然是/home/yourname)。也许你还需要先终止一些仍在运行的该用户的进程。要这样做,输入ps -u username,查找匹配的PID并通过kill PID-number命令将它们终止。

更新:正如arrange提到的,一些文件可能引用了你的旧家目录。你可以保留一个符号链接以实现向后兼容性,例如:ln -s /home/newname /home/oldname,或者你可以使用sed -i.bak 's/*oldname*/*newname*/g' *list of files*命令更改文件内容。它会为每个文件创建一个带有.bak扩展名的备份。

一些额外的信息,适用于像我这样不太有经验的用户:
由于我只有一个用户账户(管理员),它不允许我更改用户名(在TTY1中的回应是“您已经登录”)。为了解决这个问题:
使用您的旧凭据登录,并在TTY1中添加一个新用户,例如“temporary”:
sudo adduser temporary
设置密码。 2. 通过将用户添加到sudo组,允许临时用户运行sudo命令。
    sudo adduser temporary sudo

3. 用命令exit退出登录。
4. 返回到tty1:使用“临时”用户账号和密码登录。按照上述提到的方法更改您的用户名和文件夹。exit(直到您看到登录提示符)。
5. 返回到TTY7(Ctrl+Alt+F7),登录到GUI/正常桌面屏幕,查看是否有效。
6. 删除临时用户和文件夹:
``` sudo deluser temporary sudo rm -r /home/temporary ```

12对于位于$HOME下的不同配置文件来说,这一点可不幸地并不正确。试着运行类似grep -IRFl /home/username ~的命令,你会看到有多少个与你的主目录相关的引用被存储在那里。 - arrange
1我在VirtualBox虚拟机上运行12.04 LTS。这个答案(使用“临时”帐户)对我有用。然而,即使系统重新启动后,GUI仍然显示旧的用户名。终端提示符和目录结构显示新的用户名。有没有办法更新GUI上显示的用户名? - Steve Koch
2是一个简单的修复方法——只需在Unity中使用用户帐户编辑器,然后重新启动。 - Steve Koch
6对于那些有加密家目录的用户,你需要编辑/home/.ecryptfs/oldusername/.ecryptfs/Private.mnt文件,将其指向你的新家目录,否则你将无法通过Unity登录。 - raphael
2sudo usermod -d /home/edge -m edge 的输出为:usermod: 无法在 /home/edge 中重命名目录 /home/empedokles,即第四步无法执行。 - empedokles
1我还建议您使用sudo nano /etc/sudoers命令,然后编辑/添加您的新用户,如果您希望他能够使用sudo权限。 - JTC
3@JTC 永远不要使用普通的 nano 编辑 sudoers 文件。请始终使用 visudo - styrofoam fly
1我认为你可以不用创建临时用户来解决问题,只需按照以下步骤操作:1. 退出图形界面(GUI),2. 登录到TTY并执行cd /tmp; exec sudo -i命令,这样你当前的shell会被sudo进程所替代,3. 终止所有以你的用户身份运行的进程(pkill -u $SUDO_USER)。这样应该能够清除使用你的用户/主目录的所有内容。 - muru
这个解决方案在我的Kubuntu 16.04上有效,但是也出现了一些问题。其中包括我无法自动登录以及xserver无法自动启动。 - AdyAdy
2在Ubuntu 16.04上无法正常工作。sudo su -sudo usermod -l new old -> usermod: user old is currently used by process 123其中123 = bash。如果你使用kill -9 123 杀掉它,系统会退出并返回登录界面。也就是说,非root用户无法更改自己的用户名。 - Juha Untinen
为了避免删除"temporary"的主文件夹,使用--no-create-home选项来创建用户。 - ma3oun
5你还需要更改组名:sudo groupmod -n 新名称 当前名称 - Alessandro
为什么我们不能导航到 /usr/share/applications/users.desktop >> 点击要更改名称的用户 >> 点击更改用户名 >> 更改名称 >> 点击确定。我认为,这将是更改用户名最简单的方法,不是吗? - Anand
这个答案更长、更令人困惑,而且不像Valentin的答案那样线性。尽管它们都包含相同的基本信息,但另一个是更好的答案。 - Cliff
1在对用户的主文件夹进行了用户修改后,用户组仍然是旧的,所以我不得不执行以下操作:groupmod -n 新用户组 旧用户组 - Aquarius Power
为什么不创建一个新用户,将其用户名和密码设置为您想要的值:'sudo adduser urname',然后将该用户添加到sudo组:'sudo adduser urname sudo',接着登录该用户并删除旧用户呢? - YourHelper
你能在WSL上使用Ubuntu做这个吗? - Vasiliki
截至Ubuntu 22.04,这仍然是正确的方法吗? - Luca Clissa

把所有的东西都放在一起:
  1. 退出当前会话或重新启动计算机以返回到起始屏幕。
  2. 在起始屏幕上进入控制台模式tty。按下Ctrl+Alt+F1(在某些Ubuntu版本中可能是Ctrl+Alt+F2)。
  3. 使用您的用户名和密码登录。
  4. 为“root”帐户设置密码。
  5. sudo passwd root
    
  6. 退出。
  7. exit
    
  8. 使用“root”帐户和之前设置的密码登录。
  9. 将用户名和主文件夹更改为您想要的新名称。
  10. usermod -l <newname> -d /home/<newname> -m <oldname>
    usermod -c "newfullname" <newname>
    

    “newfullname”是/etc/passwd中的第五列,可能是“First Last”,例如。

  11. 将组名更改为您想要的新名称。
  12. groupmod -n <newgroup> <oldgroup>
    
  13. 锁定“root”帐户,使其不再具有有效密码,无法用于作为root用户登录。
  14. passwd -l root
    
  15. 如果您正在使用ecryptfs(加密的主文件夹),请使用ecryptfs-recover-private挂载您的加密目录,并编辑<mountpoint>/.ecryptfs/Private.mnt以反映您的新主文件夹。
  16. 退出。
  17. exit
    
  18. 按下Ctrl+Alt+F7返回Ubuntu图形模式登录屏幕(在某些Ubuntu版本中可能是Ctrl+Alt+F1)。
现在您可以使用新的用户名登录。

11如果在执行usermod -l 命令后,你收到了user <oldname> is currently used by process <processno>的提示,那么你可以通过使用ps aux | grep <processno>命令来查找该进程(可能是一个守护进程或者tmux/screen)。你可能希望优雅地停止该进程,否则你可以使用kill <processno>命令。 - RedPixel
1非常感谢您整理这个评论。它非常有用。不过,还有两件事情可能需要提及。在第4步之后,我重新启动了计算机,以免在第6步出现错误信息。此外,在完成此过程后,/etc/passwd文件将具有与旧用户名匹配的ID注释。这将导致登录屏幕显示旧的登录名。我无法找到一个合适的方法通过命令行来修复它,但是我通过登录用户账户,进入账户设置,并将“登录名”更改为用户名来解决了这个问题。这样更新了/etc/passwd文件并解决了问题。 - Jibbers
1这是最简单且百分之百可靠的方法。正如@Jibbers建议的那样,在第四步之后最好重新启动。 - Yerke
我要提一下,“文件浏览器窗口中的书签”现在指向旧文件夹,所以我得删除那些书签。 - ollydbg23
无法工作。如果在开始时按下Ctrl+Alt+F1,它会尝试登录到新创建的用户,但不会允许这样做。 - empedokles
我对禁用root用户的目的不太确定(passwd -l root),为什么需要这样做呢? - hello_there_andy
我在Lubuntu 16.04上尝试了这个,但它破坏了我的安装:我无法登录到lightdm,出现一个对话框显示"您的显示器分辨率过低",并提供了一个后续对话框以尝试默认设置,但默认设置不起作用,而其他选项我无法选择,因为没有鼠标来选择其他选项,也无法通过TAB和箭头键访问其他选项。 - rubo77
我在Lubuntu 16.04上尝试了这个,但是它破坏了我的安装:我无法再登录到lightdm,我得到一个对话框"系统正在以低图形模式运行",后面还有一个对话框"尝试使用默认图形模式运行"(但这些选项都不起作用),或者"重新配置图形"(其他选项我无法选择,因为没有鼠标指针来选择其他选项,也无法通过TAB和箭头键到达其他选项!)所以:我不得不重新安装lubuntu才能恢复图形! - rubo77
你需要替换隐藏文件中的任何引用,即使如此,有些东西仍然会出现问题。 - chefarov
为什么我们不能导航到 /usr/share/applications/users.desktop >> 点击要更改名称的用户 >> 点击更改用户名 >> 更改名称 >> 点击确定。我认为,这将是更改用户名最简单的方法,不是吗? - Anand
在我的ubuntu 16.04 LTS中,在第6步killall -u <old_user>之前,需要终止前一个用户的所有作业,并在第7步sudo mv /home/<old_user> /home/<new_user>之后重命名用户目录。 - Eric Sun
2如果通过SSH进行操作,您需要在一段时间内启用SSH配置中的root登录。执行sudo nano /etc/ssh/sshd_config命令,取消注释PermitRootLogin并将其值更改为yes。然后重启SSH服务,执行sudo systemctl restart sshd命令。在使用root用户修改完毕后,请将所有设置恢复到原始状态,即锁定root账户并禁用远程root登录。 - TimD
在第6步重命名管理员用户帐户时,我遇到了“权限被拒绝”的问题。有什么办法可以绕过这个问题吗? - June Wang
在运行Ubuntu的Mac上,我不得不使用Ctrl-Alt-F3来进入终端。 - joshp
在安装Ubuntu时,禁止使用带有点/句号的用户名,所以我将用户名设置为“firstlast”。然后,在完成完整的Ubuntu安装之后,我按照以下说明添加了一个句号到用户名中,将其从“firstlast”更改为“first.last”,结果完美运行! - Gabriel Staples

重启进入恢复模式并进入根提示符 shell("切换到根提示符 shell")。
首先重新挂载根目录。
mount -o remount,rw /

更改用户名和主文件夹名称,
usermod -l <newname> -d /home/<newname> -m <oldname>

对于团队名称,
groupmod -n <newgroup> <oldgroup>

1当我使用usermod -l <newname> -d /home/<newname> -m <oldname>命令时,会出现错误提示usermod: user oldusername is currently used by process 3170。即使我杀掉该进程,仍然会出现相同的错误。我正在使用Ubuntu 13.10操作系统。 - Waqas
4如果您的主目录已加密,请不要执行此操作!!!我按照这个步骤进行了操作,结果让我经历了两个小时的疯狂旅程... 恢复的唯一方法是再次执行此操作,并将原始(不喜欢的)名称恢复回去。您可能会遇到的问题是“无法进入挂载点”。 - Mike
为什么我们不能导航到 /usr/share/applications/users.desktop >> 点击要更改名称的用户 >> 点击更改用户名 >> 更改名称 >> 点击确定。我认为,这将是更改用户名最简单的方法,不是吗? - Anand

在Ubuntu 13.10、14.04和16.04上:
1. 点击"系统设置"图标。 2. 点击"用户账户"。 3. 您的管理员账户应该会显示出来。 4. 点击"解锁"按钮。 5. 根据提示输入您的用户密码以允许对账户进行更改。 6. 解锁后,您可以点击您想要更改的旧用户名,并输入一个新的用户名来替换它。 7. 输入新名称后,点击"锁定"按钮以使更改永久生效。 8. 重新启动Ubuntu。

13这并没有为我更改用户名,只是更改了名称。旧的用户名仍然出现在终端中,并且作为主目录和组(即使重新启动后也是如此)。 - DougC

当收到 usermod: can't change /etc/password 时,只需运行以下命令:
在根恢复控制台中运行:
mount -o remount,rw /

再次运行:
usermod -l <newname> -d /home/<newname> -m <oldname>

为什么我们无法导航到/usr/share/applications/users.desktop >> 点击要更改名称的用户 >> 点击更改用户名 >> 更改名称 >> 点击确定。我认为,这将是更改用户名最简单的方法,不是吗? - Anand

当你执行usermod -l <newname> -d /home/<newname> -m <oldname>命令时,你会得到useradd: can't change /etc/passwd的错误提示信息,为了避免这个问题,只需在上述命令前添加sudo --即可。
sudo -- usermod -l <newname> -d /home/<newname> -m <oldname>

sudo --  groupmod -n <newgroup> <oldgroup>

这里@karthick87给出的答案完全有效,但为了安全起见并避免所有故障,我会采取以下措施:

  1. 创建一个单独的账户/用户,并确保该账户/用户具有root权限或可以登录为任何可root的用户。
  2. 注销当前账户,然后使用步骤1中提到的账户登录。
  3. 终止前一个用户的所有进程。
  4. 现在按照@karthick87提到的步骤进行操作,更改用户名和主目录所有者。
  5. 然后按照@Sriraj Hebbar的答案更改组名。
  6. 用备用用户注销,然后用您的用户登录。如果您创建了额外的用户,请删除它。

由于并非所有的Linux系统(尽管Ubuntu必须有)都有usermod应用程序,所以您可以手动进行操作。作为root用户,打开/etc/passwd文件,使用vim或系统中存在的任何其他编辑器进行编辑:
sudo vim /etc/passwd

在一行的开头更改用户的名称:
user:x:500:501:username:home/user:/bin/bash

给:
newuser:x:500:501:username:home/user:/bin/bash

然后如果你是以root身份登录的,就直接登录;而如果你已经以用户身份登录了,就注销然后重新登录。

当然,你还需要修复/etc/shadow和/etc/group文件,以确保系统正常运行。感谢@JohanBoulé

注意:使用这种方法时要小心,以免破坏系统。

注意:这种方法通用,不仅适用于Ubuntu,对于Ubuntu来说它会起作用,但谷歌搜索也会显示出来,甚至对非Ubuntu搜索,例如嵌入式Linux。


在我发现usermod命令之前,我尝试过这种方法,但用户的密码不再被接受。 - Ben Voigt
@BenVoigt 不是所有的电脑都有 usermod。 - Малъ Скрылевъ
4这是Ubuntu!如果没有usermod命令,你的安装可能出错了,因为它是passwd软件包的一部分,而且是必需的。 - Auspex
@Auspex 我知道这里是Ubuntu的问答区,但这种方法是通用的,不仅适用于Ubuntu,而且对于Ubuntu来说也有效。然而,谷歌搜索会显示它甚至适用于非Ubuntu搜索,比如嵌入式Linux。 - Малъ Скрылевъ
1无论是使用usermod还是其他类似的神秘模糊命令,我都会以相同的方式进行操作,因为我觉得这样更容易记住,并且不会干扰正在运行的进程。至少需要编辑/etc/passwd和/etc/shadow文件,如果你想要一个与用户同名的组,还需要编辑/etc/group文件。 - Johan Boulé
@JohanBoulé 谢谢 - Малъ Скрылевъ
我本来打算不再回应这个问题,但是我无法忍受。首先,这是Ubuntu的问答环节,你也承认了。提出一种在Ubuntu系统上并非必需且潜在危险的方法是一个糟糕的主意。@JohanBoulé的论点非常糟糕。这个"伪神奇的晦涩命令"存在的目的是为了使这种改变变得容易,而不会导致登录出现问题,就像Ben所做的那样。usermod并不是魔法,也不是晦涩的,它是在Ubuntu上进行这种更改的正确方式。 - Auspex
我的非常糟糕的论点,正如你所说,是passwd、shadow和groups的文件格式非常简单,并且有相当完善的文档和标准...而且很容易记住或在man手册中查找。另外请注意,groupmod命令不会为您完成组文件中需要的所有编辑。因此,对于组文件,请继续使用您喜欢的文本编辑器打开它,以替换所有出现的"debian"。最后,请注意,无法在禁止root ssh登录的无头服务器上使用提供的解决方法来运行进程,这是默认设置。 - Johan Boulé
@Auspex "这是在Ubuntu上进行更改的正确方法。" 这并不是唯一的方法,人们必须了解所有的方法,我已经在SO/SE上确认过了。 - Малъ Скрылевъ
这不是SO/SE。这是AskUbuntu。 - Auspex
@Auspex 哈哈,你真的不知道 AskUbuntu 是 Stack Overflow/Stack Exchange 社区的一员吗?) - Малъ Скрылевъ
当然我知道。在AskUbuntu上添加一个备选答案没有错,但事实就是这是AskUbuntu,如果你在前面加上“对于非Ubuntu系统,你可能想使用...”,我会接受的。然而,在Ubuntu系统中,必须使用usermod,而且usermod是在Ubuntu系统中正确的方法。Ubuntu用户不需要被告知可能破坏他们系统的方法。而且建议使用vim同样是错误的... - Auspex
对于我来说,(我使用ALT键),我更喜欢通过编辑器手动修复用户名的方法,即使系统中也存在usermod命令,这是唯一正确的附加方式来更改用户名。而且这种方法本身无法保证系统的稳定性,因为人为操作可能会导致系统崩溃... 我做了一些修改。 - Малъ Скрылевъ