如何在终端中为现有用户追溯创建一个默认的主目录?

我创建了一个没有家目录的用户,现在我想为他们创建一个家目录。不仅仅是一个名为/home/new-user的文件夹,而是一个完整的默认家目录,包括所有正常的文件夹、隐藏文件等。
我该怎么做?

当用户登录时,这些子目录(文档、下载等)将会自动创建。尽管我正在寻找通过终端“模拟”他的登录的方法。 - Alaa Ali
@阿拉 su 新用户 :D - Radu Rădeanu
1@RaduRădeanu,是的,我已经尝试过了,还试过sudo -i -u new_user,但都不起作用。我觉得我们需要"模拟一个X登录"...不知道怎么做。 - Alaa Ali
3登录不会在主目录中创建子目录。 - Jo Rijo
5个回答

使用以下命令(作为root用户运行,或者如果不是root用户则使用sudo):
mkhomedir_helper username

为了使其起作用,文件夹 /home/username 不能存在。
对于 X 相关的文件夹(桌面、下载等),您需要在图形环境下登录;它们将在您首次登录时自动生成。

2简单而实用。通过这种方式,您还可以确保新创建的主目录符合您的系统策略,而无需了解它们或进行任何手动调整。 - gerlos
这是正确的答案,至少在我的Ubuntu 14.04.2 LTS上有效。 - Christian Wilkie
1在这之前,我必须先在/etc/passwd中设置我的用户名,然后才能使其正常工作。 - user79878
3简单..只是有效(商标)。应该是被接受的答案。 - Newtopian
1别忘了用ls -l /home命令检查目录的权限。我发现新目录可以被其他所有用户读取,所以我用chmod go-r-x /home/username命令移除了这些权限。 - Don Kirkby
3这不会在home目录下创建文件,比如.bashrc。对我没有起作用。 - Desik
@Desik 确保你以 rootsudo 运行,似乎可以正常工作。 - Jesse Nickles
@Desik 看一下用 ls -a。也许,文件在那里,但是简单的 ls 没有显示出来。我也有同样的印象(它没有工作),因为当我执行时 /home/ 是以只读方式挂载的。 - imz -- Ivan Zakharyaschev
静默失败,直到我添加了sudo: sudo mkhomedir_helper username - Harsha Laxman

子目录(文档、下载等)会在用户首次通过GNOME登录时自动创建,前提是以正确的权限创建了主目录。以下是演示: alaa@aa-lu:~$ sudo useradd testinguser alaa@aa-lu:~$ sudo passwd testinguser 输入新的UNIX密码: 重新输入新的UNIX密码: 密码已成功更新 alaa@aa-lu:~$ sudo ls -l /home 总计 20 drwxr-xr-x 55 alaa alaa 4096 8月 22 22:00 alaa drwx------ 2 root root 16384 6月 5 09:46 lost+found alaa@aa-lu:~$ sudo mkdir /home/testinguser alaa@aa-lu:~$ sudo chown testinguser:testinguser /home/testinguser alaa@aa-lu:~$ ls -l /home 总计 24 drwxr-xr-x 55 alaa alaa 4096 8月 22 22:00 alaa drwx------ 2 root root 16384 6月 5 09:46 lost+found drwxr-xr-x 2 testinguser testinguser 4096 8月 23 10:03 testinguser alaa@aa-lu:~$ ls -l /home/testinguser/ 总计 0 alaa@aa-lu:~$

您可以通过检查/etc/passwd中的条目来验证用户的主目录是否正确设置。默认情况下,您应该看到主目录设置为/home/testinguser:

alaa@aa-lu:~$ grep testinguser /etc/passwd
testinguser:x:1001:1001::/home/testinguser:/bin/sh

如果您在那里没有看到主目录/home/testinguser,则需要执行命令sudo usermod -d /home/testinguser testinguser来更新它,尽管您不应该需要使用此命令,因为它应该被默认设置(根据useradd的手册页)。

然后,我注销了我的帐户,并使用testinguser重新登录,这是自动创建的子目录:

alaa@aa-lu:~$ ls -l /home/testinguser/ 总用量 36 drwxr-xr-x 2 testinguser testinguser 4096 8月 23 10:05 Desktop drwxr-xr-x 2 testinguser testinguser 4096 8月 23 10:05 Documents drwxr-xr-x 2 testinguser testinguser 4096 8月 23 10:05 Downloads drwxr-xr-x 2 testinguser testinguser 4096 8月 23 10:05 Music drwxr-xr-x 2 testinguser testinguser 4096 8月 23 10:07 Pictures drwxr-xr-x 2 testinguser testinguser 4096 8月 23 10:05 Public drwxr-xr-x 2 testinguser testinguser 4096 8月 23 10:05 Templates drwxr-xr-x 2 testinguser testinguser 4096 8月 23 10:05 Videos
我不需要复制/etc/skel的内容。
如果可能的话,请尝试按照以下步骤创建另一个新用户。完成后,您可以通过sudo deluser testinguser && sudo rm -r /home/testinguser来删除此新用户。
如果所有这些对你都没有起作用,那么我猜这是一个bug。

1在某些情况下,当您使用useradd命令时,新用户的默认主目录并不会自动设置为/home/username。因此,在开始之前,您必须确保这一点。 - Radu Rădeanu
你能给我举个这些情况的例子吗 =)? 从useradd的手册中可以看到:"useradd将使用在/etc/default/useradd中指定的基本目录,或者默认情况下使用/home。" /etc/default/useradd中的HOME变量默认未定义,因此useradd将始终使用/home。无论如何,我会编辑我的答案并将检查/etc/passwd的部分提前。 - Alaa Ali
这里有一个例子。另一个例子是,你删除了一个用户,但没有删除他的目录和文件;然后你再次添加了一个同名的用户。还有很多这样的例子,而且没有任何错误 :) - Radu Rădeanu
如果在用户行/etc/passwd中没有/bin/sh,您需要为该用户添加一个shell,例如使用usermod -s /bin/sh testuser命令来设置默认shell。 - rubo77
并非所有的系统都安装有GNOME,建议某人删除并重新添加用户以创建家目录只是错误的建议。 - ntwrkguru

更新:解决方案已破损,对我也无效。
如果您希望在用户的主目录不存在时创建它,请使用useradd命令,并带上-m标志。这将复制/etc/skel目录中的所有文件。
useradd -m username

你可能需要为你的系统配置设置。根据man手册:
  -m, --create-home
    Create the user's home directory if it does not exist. The files and directories
    contained in the skeleton directory (which can be defined with the -k option)
    will be copied to the home directory.

    By default, if this option is not specified and CREATE_HOME is not enabled, no
    home directories are created.

并进一步指出:
CONFIGURATION

   The following configuration variables in /etc/login.defs change the behavior
   of this tool:

   CREATE_HOME (boolean)
       Indicate if a home directory should be created by default for new users.

12似乎试图创建一个新用户,因为它告诉我"用户 'new-user' 已经存在"。 - Jo Rijo
我还测试了在创建新用户时使用-m标志,但它没有起作用;它只是复制骨架文件。 - Alaa Ali
@Jo:这个为什么是错误的呢?根据初始帖子,用户已经存在了。 - crafter
3这个答案并没有解决问题。复制/etc/skel不会在主目录中创建子目录。而且,useradd -m是用于创建新用户时使用的,而不是已经添加了用户时使用的。 - Alaa Ali
我更新了帖子,所以在login.defs配置文件中将CREATE_HOME设置为yes。 - crafter

如果你使用adduser命令创建了新用户,你不需要为新用户创建一个主目录。在/home目录下会自动创建以用户名命名的主目录,其中包含以下子目录:桌面、下载、文档、音乐、图片、视频(和其他一些),供新用户使用。

如果你使用useradd命令创建了新用户,则在终端中运行以下命令:

sudo -i     #enter your user password when you are asked
gedit /etc/passwd

编辑`/etc/passwd`文件作为root用户(这是最重要的一步)。找到包含新用户名称的那一行,并为他设置一个类似于以下形式的默认主目录:
new_username:x:1001:1001::/home/new_username:/bin/sh

在这一行,您还可以为新用户添加真实姓名或设置默认的 shell。就像这样:

new_username:x:1001:1001:Real New Username,,,:/home/new_username:/bin/bash

小心,不要做任何其他更改。

在保存文件之后,在退出根帐户之前,请运行以下命令:

mkdir /home/new_username                                #to create the directory /home/new_username
cp -r /etc/skel/. /home/new_username                    #to copy skeleton files to /home/new_username
chown -R new_username:new_username /home/new_username   #to change the owner of /home/new_username to the new user

在完成所有这些步骤后,新用户的主文件夹将在首次登录后自动填充。
另请参阅:如何在创建帐户后生成用户主文件夹?

据我所记,家目录不会自动创建,你需要手动创建并更新用户在/etc/passwd中的条目(如果还没有)。一旦用户登录,家目录将自动填充这些子目录。然而,如果使用adduser而不是useradd来添加用户,所有这些都会被处理好。 - Alaa Ali
@Alaa 我几天前刚测试过,我使用了adduser命令:家目录是自动创建的。而且,在首次登录后,家目录会自动填充。 - Radu Rădeanu
这似乎没有任何作用。也许我可以尝试一下其他问题中的bash脚本,但是我不能只是在/home/目录下创建一个名为new_user的文件夹,然后将/etc/skel目录的内容复制到其中吗?那个bash脚本就是这样做的吗? - Jo Rijo
@JoRijo 我修改了我的回答。 - Radu Rădeanu
@RaduRădeanu 你是不是指的是 cp /etc/skel/* /home/new_username?另外,为什么要使用连续两个 chown 命令呢? - Alaa Ali
@Alaa 嗯,感谢你的观察。当你发现这样的错误时,你也可以自己编辑答案。 - Radu Rădeanu
那是最好的答案。 - Themelis

只需要家目录就能让它正常工作。作为超级用户,
cd /home
cd mkdir username
chown username username
chgrp username username

第一次登录时应该创建所有必要的文件,看起来是这些文件:
drwxr-xr-x 16 fotanus fotanus 4096 Jun  4 17:46 .
drwxr-xr-x  9 root    root    4096 Jun  4 17:43 ..
drwx------ 11 fotanus fotanus 4096 Jun  4 17:46 .cache
drwx------ 13 fotanus fotanus 4096 Jun  4 17:46 .config
drwxr-xr-x  2 fotanus fotanus 4096 Jun  4 17:45 Desktop
drwxr-xr-x  2 fotanus fotanus 4096 Jun  4 17:45 Documents
drwxr-xr-x  2 fotanus fotanus 4096 Jun  4 17:45 Downloads
drwx------  3 fotanus fotanus 4096 Jun  4 17:46 .gconf
drwxrwxr-x  2 fotanus fotanus 4096 Jun  4 17:46 .gstreamer-0.10
-rw-------  1 fotanus fotanus  334 Jun  4 17:45 .ICEauthority
drwxr-xr-x  3 fotanus fotanus 4096 Jun  4 17:45 .local
drwx------  4 fotanus fotanus 4096 Jun  4 17:45 .mozilla
drwxr-xr-x  2 fotanus fotanus 4096 Jun  4 17:45 Music
drwxr-xr-x  2 fotanus fotanus 4096 Jun  4 17:45 Pictures
drwxr-xr-x  2 fotanus fotanus 4096 Jun  4 17:45 Public
drwxr-xr-x  2 fotanus fotanus 4096 Jun  4 17:45 Templates
drwxr-xr-x  2 fotanus fotanus 4096 Jun  4 17:45 Videos
-rw-------  1 fotanus fotanus   55 Jun  4 17:45 .Xauthority
-rw-------  1 fotanus fotanus  711 Jun  4 17:45 .xsession-errors