如何更改我的用户ID?

我的系统上只有一个用户。我该如何将其用户ID从默认的1000更改?
如果在典型的桌面安装中需要额外的步骤以避免破坏登录过程,这些步骤应包含在答案中。

6出于好奇,更改用户ID的原因是什么? - Olivier Lalonde
23如果您通常通过NFS或其他保留UID的复制方法与其他系统交换数据,那么如果您在不同系统上使用相同的用户名对应相同的UID,将会很有帮助。 - João Pinto
3João做对了。特别是,我希望在Mac OS X中将UID与用户匹配,以便共享文件系统可以在不同操作系统间传递所需的权限。 - ændrük
2Nethack目前的版本(3.6.0)在保存游戏时会将当前用户ID(uid)包含在文件名中。如果你想在不同设备间同步存档,就需要匹配用户ID。(使用符号链接并不实际) - Jonathan Hartley
1就所有严肃的意图和目的而言,这是不受支持的,这里的所有答案都是狡猾且风险高的使用方式。 - aderchox
9个回答

你可以在/etc/passwd/etc/group/etc/shadow中进行更改,或者使用上述首选的可能性之一。但是最重要的是,你必须更改属于该用户的所有文件的所有权。
例如,如果旧的用户ID是1000,新的用户ID是5000:
find / -uid 1000 -exec chown -h 5000 {} +

如果你也改变了群组ID,同样适用。

find / -gid 1000 -exec chgrp -h 5000 {} +

10这是一个非常重要的观点。如果你只按照其他答案中给出的技巧去做,而不同时也做到这一点,很多事情都会出问题。 - poolie
6我刚学到最好使用 sudo find / -xdev -uid 1000 -exec chown 5000 '{}' \+,否则会包括挂载的数据(在 /mnt 中,可能是不希望的),以及你最好不要干扰的 /proc/dev 中的文件。请参阅此帖子 - Sebastian
4这不是一个好主意。考虑到/home在不同的文件系统中,你甚至无法改变自己文件的所有权。 - ddeimeke
1对于这个问题,您应该在编辑/etc目录下的文件之前更改组和UID权限,对吗? - MrDaniel
无论你先做什么都没关系。 - ddeimeke
2你还想在/media/<USERNAME>上更改ACL权限,就像这个评论中所提到的那样。 - oulenz
1我尝试了上述命令,现在无法再进入系统了。希望原帖提供一步一步的解决方案,而不是对他人解决方案的修复方法。 - SKPS
1为什么需要/etc/shadow文件?它只是存储密码,对吗? - kstn

基于@AlexandreP和@ddeimeke的完整解决方案+官方文档。无需重新启动。
Debian/Ubuntu的政策是,如果有一个用户jim,用户ID为1001,则还会有一个组jim,组ID为1001。此解决方案还会更新这些组ID。
  1. 启用root账户:

    sudo passwd root
    
  2. 如果用户已登录,则注销(包括虚拟终端)
  3. 进入VT1:Ctrl-Alt-F1
  4. 以root身份登录,并使用提供的用户名和旧/新UID运行以下命令:

    # 将所需信息放入变量中
    username=...
    old_uid=`id -u $username`  # 查找当前(旧)uid
    new_uid=...
    
    # 更新$username的用户ID和组ID
    usermod -u $new_uid $username
    groupmod -g $new_uid $username
    
    # 更新文件所有权
    # 注意:不能合并下面两个chown命令,否则只有uid或gid匹配的文件将不会被更新
    chown -Rhc --from=$old_uid $new_uid /    # 更改用户ID
    chown -Rhc --from=:$old_uid :$new_uid /  # 更改组ID
    
  5. 注销
  6. $username身份登录
  7. 禁用root账户:

    sudo passwd -dl root
    

1启用根帐户不应该是必要的;只需使用恢复模式 - ændrük
4这应该比重新启动更快,这就是为什么我发布了它。 - l0b0
6在Ubuntu 14.04和14.10中,您还需要修复/media中的扩展ACL权限,否则自动挂载(在Nautilus/Nemo中)会出现故障,因为旧的UID仍然存在。sudo setfacl -m "u:<NEWUID>:r-x" /media/<USERNAME> sudo setfacl -x "u:<OLDUID>" /media/<USERNAME> - richud.com
1这对我来说非常有效。只需要更改uid就可以了。 - chmike
2启用根账户对我来说似乎比使用恢复模式更容易(也不那么可怕)。 - Jonathan Hartley
根据20.04,@richud.com仍然是真实的。就我所了解,唯一具有ACL权限的其他文件位于/var/log/journal目录下,我认为可以忽略它们,但我不知道它们的用途。 - oulenz
至少从Ubuntu 18.04开始,usermod会自动更新用户主目录中的文件的UID,请参考man usermod。因此,只有在主目录之外的文件才需要使用chown命令。不过,仍然需要更新组ID。 - Pierre H.

问题是,正如你所提到的,当用户处于登录会话状态时,无法更改用户的UID。您必须使用另一个用户帐户来进行操作。
但是您不需要创建一个新的用户帐户,将其提升为管理员,注销,然后登录到新的管理员帐户,更改您的主帐户的UID,再次注销,然后登录到您的主帐户,然后删除新的管理员用户只需更改您的UID。 ;)
您可以启动恢复模式(这是在计算机启动时出现的选项,或者在BIOS消息完成后按住Shift键;在运行OEM-Ubuntu的Dell机器上使用ESC)。这将使您登录root会话。在root会话中登录而不是您通常的用户帐户,您将能够修改您的UID。
因为恢复模式仅在命令行界面中起作用,一旦登录到root会话,您将需要:
  1. 使用BubbaJ的指示将根文件系统重新挂载为读写模式mount -o remount,rw /

  2. 使用Luis Alvarado的命令usermod -u NEW_UID your_username

  3. 按照ddeimeke的指示更新文件权限。
  4. 然后,重新启动计算机(reboot),以便以正常模式启动。

2不适用于Ubuntu 14.04。执行usermod -u NEW_UID your_usernamefind / -uid 1000 -exec chown -h 5000 '{}' \+后,重启会导致只有猜测会话(guess-session-only)GUI登录。 - Kay
1也许,家里的隐藏文件没有正确更改?你在家里使用加密吗? - math
1如果您在配置文件中更改了uid,超出了这些配置文件提供的策略,您可能希望检查/etc/login.defs/etc/adduser.conf文件。超出策略限制的用户不会显示在登录循环中,但您可以更改策略。请参阅此答案 - K Markey
1usermod: 用户 user_name 当前被进程 1118 使用。@Alexandre P. - alper
1回答中缺少@KMarkey评论的建议。如果您在 /etc/login.defs/etc/adduser.conf 配置范围之外更改用户ID,则无法登录到Gnome。对我来说,最后一步修复了这个问题。 - Kaz

如果你去控制台并输入以下命令:usermod --help,你会得到其中一个参数的说明: -u, --uid UID 用户帐户的新UID 所以,如果你想改变用户cyrex的UID,可以执行以下操作: usermod -u 1000 cyrex 这将把cyrex的UID从之前的值更改为1000。
如果你想通过可视化界面来执行此操作,请按照以下步骤进行:
前往

系统 --> 管理 --> 用户和组

从列表中选择自己,并点击"高级设置"。
UID位于该窗口的末尾。

2我尝试了你建议的图形方法,但是出现了一个提示信息,上面写着“用户登录时无法更改用户ID。”你有测试过这个方法吗? - ændrük
3呵呵,那是真的。我用另一个账号试过了。你需要通过root或其他管理员账号登录,然后以图形方式操作。对此我表示抱歉。 - Luis Alvarado

  • 前往 系统>>管理>>用户和组

alt text

点击高级设置,然后转到高级选项卡,在底部你会看到你的用户ID。 更改它并点击确定。
alt text

2我应该忽视你屏幕截图里的警告:“用户登录后无法更改用户ID”吗? - ændrük
1你必须从另一个用户账户中更改它,以消除这个警告。 - karthick87
8我的问题是“我如何更改自己的用户ID?”如果你打算回答我应该创建一个新用户来编辑这个值,你应该修改你的回答来指示这样做。 - ændrük

这是总结,至少自Ubuntu 20.04以来所需的(为了保持能够使用自动挂载,需要更改扩展ACL权限):
例如,我想要将用户ID和组ID从默认值(uid=)1000(和gid=1000)更改为(uid=)5000(和gid=5000),这样就可以访问使用ext4或类似系统格式化的移动驱动器(具有uid和gid)而不会出现问题,如果文件和存档具有相同的用户ID或组ID 5000,无论其他计算机或操作系统是否向其写入数据(这样可以在计算机之间轻松共享文件,如果所有自己的用户具有相同的uid和gid)。
首先,我创建了一个额外的用户,以新用户身份登录,然后在终端中使用sudo su -命令切换到root用户,然后我使用以下命令。
find / -uid 1000 -exec chown -h 5000 {} +

更改用户ID和
find / -gid 1000 -exec chgrp -h 5000 {} +

用于更改组ID。 (注意:这会更改所有已挂载设备的权限。如果不需要,请卸载所有不需要的设备或将命令部分find /缩小到find /home/<user>或其他方式。)

在Fedora中,这个方法有效,但在Ubuntu中并非完全有效。例如,自动挂载无法正常工作。然后我读到,还必须修复扩展ACL权限,否则像自动挂载这样的功能会出现问题(可能是因为ACL权限的问题,如果没有用户已经具有此UID和GID,则不会出现问题,但在我的情况下,这就是问题所在)。从Ubuntu 14.04和14.10开始,似乎需要更改扩展ACL权限。

以下是使自动挂载恢复正常的命令:

sudo setfacl -m "u:<NEWUID>:r-x" /media/<USERNAME>

将UID权限设置为“media”文件夹中的自己文件夹。

sudo setfacl -x "u:<OLDUID>" /media/<USERNAME>

删除对旧UID的用户文件夹的权限(是的,这个命令不是为了重新启用自动挂载,而是确保具有旧UID的另一个用户也无法访问媒体)。

顺便说一下:有人说,自Ubuntu 18.04起,usermod已经更改了家目录中的所有权限,但至少在Ubuntu 20.04.4之前,这似乎还不够。

我从以下信息来源获取并实际测试了大约一个月: 答案中包含我解释的所有内容,但有点混乱,只有一个建议修复扩展ACL权限以保持能够自动挂载。

附言:如果有人问为什么我没有将此问题发布为带有解决方案的问题,那么我必须说,我在这些网站上没有足够的“声望”来这样做。所以请投票支持这个答案。


使用KDE: 在更改高级用户设置菜单中:
从另一个用户切换不适用于默认用户1000。
你必须手动进行操作 - 这是我的经验。

首先,您需要以 root 身份登录,至少暂时这样做,让我们使其成为可能:

sudo passwd root

重启,按下ctrl + alt + f1切换到控制台,以root身份登录,然后执行以下操作(家目录的所有权将自动处理):
groupmod --gid NEWGID username
usermod  --uid NEWUID username 

对于不在您的主目录中的文件,请将其更改为以下位置:
sudo chown -R username:username /path/to/files

删除并锁定root的密码,如果你愿意的话。(我倾向于保留它)
passwd -dl root

我按照ddeimeke's的指示进行了以下更改:

  1. 我没有注销,而是使用sudo su
  2. 我没有触碰/etc/shadow

我在其他答案中看到有人提到应该使用恢复模式引导或以root用户登录。我的系统是全新的Ubuntu 14安装,所以我愿意测试是否可以在不以root用户身份登录的情况下工作。此外,我是通过SSH连接到EC2实例上进行操作的。