如何在创建账户后制作用户主文件夹?

我使用useradd name创建了一个新用户,但忘记使用-d -m来创建他们的主目录。我尝试创建一个主目录,并将/etc/skel的内容复制到其中,然后使用chown命令将所有文件都更改为新用户的所有权。
别名无法正常工作,例如ll,而且命令提示符只显示$,而不是name@server ~$
此外,使用滚轮会在命令行上输出垃圾字符 :(
请问如何修复这个问题,或者直接删除该用户重新开始是否更容易?

1我还没弄清楚从那个点开始还需要什么,但是我通过删除用户和目录,然后重新使用adduser而不是useradd来解决了这个问题。 - mortona42
1我认为这将导致不同的用户ID和组ID,这可能对您来说是一个问题或者不是问题。 - grantbow
6个回答

因为您正在使用sh shell,所以在命令提示符下有$

具有name@server的shell基于bash shell。

您必须通过以下方式更改新创建用户的默认shell:usermod -s /bin/bash

如果不存在用户主目录,则再次使用usermod添加用户主目录。usermod -d /home/username

如果用户在/etc/passwd中未指定主目录:

运行mkhomedir_helper <username>以创建主目录。 mkhomedir_helper 还将创建用户主目录并复制/etc/skel中的内容。

如果用户已经在/etc/passwd中指定了主目录:

例如通过usermod -d /some/directory,则mkhomedir_helper将无法工作。唯一的方法是手动为受影响的用户创建主目录。


我从上一个命令的输出是'usermod: no changes',尽管在家目录中没有任何目录。 - AlxVallejo
@AlxVallejo,谢谢你的评论。我进行了一些测试并相应地编辑了我的回答。希望它也能帮助回答你的问题。 - iridescent
@iridescent 谢谢你的测试。关于 shell 的提示很有帮助。我认为你对这两种情况的描述几乎是完整的,但在最后一句中不经意地误导了一点,描述了“唯一的方式”。实际上,家目录必须在 /etc/passwd 中指定。这与 /home 在磁盘上有一个 <用户名> 目录并阻止 mkhomedir_helper 完成的情况无关。快速执行 rm -rf /home/<用户名> 应该可以让 mkhomedir_helper <用户名> 完成 @Zenexer 脚本下手动执行的任务。 - grantbow
9sudo mkhomedir_helper <username> 对我来说很有效。如果没有使用sudo,mkhomedir_helper会默默地失败。 - mv288
为了与其他主目录(700或drwx------)匹配,我不得不使用mkhomedir_helper my_user 0077 - Boop
不要忘记在提供的两个命令中使用sudo。

创建主目录

sudo mkhomedir_helper jira1

在用户登录时运行定义的shell

sudo usermod <username> --shell /bin/bash
- Saurabh Gupta

如果你忘记使用-d -m,最好和快速的选择是运行
sudo mkhomedir_helper username

使用此选项将创建主目录,就好像您已经提供了缺失的选项一样。


这是一个快速的bash脚本。以sudo身份作为root运行。它接受任意数量的参数,每个参数都是需要一个家目录的用户名。这里有几个假设:你的家目录在/home下,你的骨架目录在/etc/skel下。这些是Ubuntu上的默认设置。你可以从gist下载或使用wget/curl命令获取这个脚本。
#!/bin/bash
if [ $# -lt 1 ]; then
    echo "Syntax: $_ USER[ USER[ ...]]" >&2
    exit 1
fi

exit_code=0

for user in "$@"; do
    home="/home/$user"
    cp -R /etc/skel "$home" && echo $'\e[32m'"Copied skeleton to: $home"$'\e[m' || ( exit_code=$?; echo $'\e[31m'"Failed to create: $home"$'\e[m' ) >&2
    chown -R "$user:$user" "$home" && echo $'\e[32m'"Set owner on: $home"$'\e[m' || ( exit_code=$?; echo $'\e[31m'"Failed to set owner on: $home"$'\e[m' ) >&2
done

exit $exit_code

看一下xdg-user-dirs-update命令。它会创建默认的X窗口目录:桌面、下载等等...
没有默认目录的用户可以运行xdg-user-dirs-update --force来创建这些目录。我为我的一个用户账户就是这样做的。
在运行xdg-user-dirs-update命令之前,我建议先阅读一下man页。关于xdg-user-dir的man页还提供了一些更详细的信息。
"XDG基本目录规范"是freedesktop.org规范的一部分。

要更改新用户的默认主目录值,您可以给予
sudo useradd -D --base-dir /home/new_user

命令。请参阅 useradd -D [选项] 来自

man useradd 

当我在使用useradd之后执行echo $HOME时,它给出了/home/new_user,所以我不认为那是问题所在,除非那不是一个好的指示器。 - mortona42
3这个回答与问题无关。我之所以说这句话是因为这个命令是用来更改系统的默认值的,如果你使用它期望得到其他结果,可能会造成损坏。 - Zenexer
看起来我对 --base-dir 选项的理解是错误的。根据 useradd 的 man 手册,--base-dir 选项是指“如果没有指定 -d HOME_DIR,则系统的默认基本目录。BASE_DIR 与帐户名连接以定义主目录。”所以我以为这个选项会将旧用户的主目录移动到新用户的主目录。 - numand
1这是不正确的。事实上,这会导致所有未来的用户主目录都被创建在/home/new_user/new_user下,而不仅仅是/home/new_user。要纠正这个问题,请执行sudo useradd -D --base-dir /home - undefined

我刚遇到这个问题(Ubuntu 12.04),我通过创建一个临时用户,复制用户目录,更改所有者,并最后删除临时用户来解决它。
sudo adduser temp
sudo cp -r /home/temp /home/name
sudo chown -R name.name /home/name
sudo deluser temp

如何更改“name”的$HOME? - Bryan Glazer