家目录未被创建

我正在尝试理解Ubuntu上的系统管理。所以,举个例子,我使用以下命令创建了一个虚拟用户:
sudo useradd -d /home/linda linda

使用 passwd 命令来创建密码。我会使用 cat /etc/passwd 命令来检查是否已经创建了一个条目。
linda:x:1004:1004::/home/linda:/bin/sh

然而,当我执行 su - linda 时,我得到的结果是

No directory, logging in with HOME=/

而且,确实没有创建任何家目录。我错过了什么?

谢谢。

11个回答

man useradd 的说明:

useradd is a low level utility for adding users. On Debian,
administrators should usually use adduser(8) instead.

注意低级实用工具
要添加用户,请使用adduser而不是。这是一个更高级的实用工具。
此外,看一下-d选项:
   -d, --home HOME_DIR
       The new user will be created using HOME_DIR as the value for the
       user's login directory. The default is to append the LOGIN name to
       BASE_DIR and use that as the login directory name. The directory
       HOME_DIR does not have to exist but will not be created if it is
       missing.
如果目录不存在,将不会创建该目录。 通常情况下,请避免使用useradd命令,而是使用adduser命令。

2在OP的辩护中,当我看到“在Debian上”这句话时,我以为它是指在Debian上而不是Ubuntu发行版上。我知道Ubuntu是基于Debian构建的,但我认为这里在做出区分。 - Keith Bennett
1我使用了adduser命令,但是创建的家目录里只有一个examples.desktop文件,没有其他任何东西。我该如何让Ubuntu自动创建默认的桌面、下载等文件夹?(我是通过ssh登录的) - mcExchange
1嗨,抱歉回复晚了,只是猜测一下,我认为那些文件夹是在第一次图形界面登录时自动创建的。只是觉得可能还有人会来这里看到 ;) - derHugo
如果有人将/etc/login.defs中的CREATE_HOME更改为"no",adduser也不会创建目录。您可以使用-m标志覆盖此设置。 - Noumenon
太好了,谢谢!这解决了我的问题。 - ali Falahati
1注意:适用于RHEL用户的提示:我认为这个问题/解决方案也适用。在CentOS 7上,您需要使用yum install shadow-utils来获取adduser,然后您就可以使用adduser命令了。 - Trevor Boyd Smith

你可以简单地通过创建主目录来解决这个问题。
mkdir /home/linda
chown linda:linda /home/linda

请再次尝试登录,这样应该就可以了。

根据man useradd的说明,如果缺少/home/linda目录,-d /home/linda选项将不会创建它。因此,您需要手动创建它。要执行此操作,请在终端中运行以下命令:
sudo -i                            #to get root privileges
mkdir /home/linda                  #to create the directory /home/linda
cp -rT /etc/skel /home/linda         #to populate /home/linda with default files and folders
chown -R linda:linda /home/linda   #to change the owner of /home/linda to user linda

另请参阅:如何在创建账户后制作用户主文件夹?

1这是正确的答案。 - Mike Q

如果你想改变默认设置,请查看/etc/defaults/useradd。使用以下命令:useradd -m -d /home/joe -s /bin/bash

1根据用户添加命令,使用-d /home/linda选项将不会创建目录/home/linda,所以这并不是一个解决方案。 - astrojuanlu
6根据useradd手册,-m标志的作用如下: -m, --create-home 如果用户的家目录不存在,则创建它。骨架目录中的文件和目录(可以使用-k选项定义)将被复制到家目录中。 除非在/etc/login.defs中将CREATE_HOME设置为no,否则useradd将创建家目录。 - Myles

使用-m而不是-d,这样目录将会为您创建: sudo useradd -m linda 另外,如果linda是一个普通用户,您可能希望她使用/bin/bash作为默认的shellsudo useradd -m linda -s /bin/bash

你还可以修改/etc/pam.d/common-session,以便在用户首次登录时创建其个人主目录。请在该文件中添加以下行。
...
session required pam_mkhomedir.so

如果您的系统位于一个网络上,用户由外部机器进行管理(例如通过LDAP),那么这将非常有用。

将以下条目添加到/etc/login.defs中,然后保存:
CREATE_HOME yes

现在,试着创建用户账户。它将会创建用户的主目录。

对我来说很有效。我需要一个基本的脚本,可以远程添加/管理不同版本的Linux上的用户。在这个改变之后,我的代码在所有服务器上产生相同的结果。谢谢。 - user311189
救命稻草,唯一对我有效的解决方案。顺便说一下,我在Python中使用os.system来调用useradd,所以很可能与此有关。 - Justin G

最有可能的原因是您没有创建主目录,这是因为您在/etc/login.defs中没有设置CREATE_HOME yes。
您可以按照@OmPS或@Radu Rădeanu建议的方法来解决此问题。
但是,未来可以通过使用以下命令之一来克服这个问题的多种方式:
  • 执行sudo adduser linda的结果:

    正在添加用户 'linda'
    正在添加新组 'linda' (1001) ...
    正在用组 'linda' 添加新用户 'linda' (1001) ...
    正在创建家目录 '/home/linda' ...
    从 '/etc/skel' 复制文件 ...
    ****密码确认****
    ****姓名提示****
    

    如果未指定--home选项,adduser将从/etc/adduser.conf选择默认值。 请注意,它还会复制/etc/skel的内容。

  • 使用--home选项执行adduser:

    sudo adduser --home /home/linda
    
与之前选项相同,只是您可能希望这样做,如果用户的主目录与您分配的用户名不同。
  • 指定基本目录给useradd命令:

    sudo useradd -b /home
    
  • 使用login.defs:在执行sudo useradd之前,修改/etc/login.defs并添加以下行:

    CREATE_HOME   yes
    
注意:如果你执行man login.defs,目前会显示以下内容: 以前由影子密码套件提供的许多功能现在由PAM处理。因此,/etc/login.defs不再被passwd(1)使用,或者login(1)和su(1)很少使用。请参考相应的PAM配置文件。 使用pam_mkhomedir PAM模块:从man pam_mkhomedir页面,将以下行添加到/etc/pam.d/login文件中:
session  required  pam_mkhomedir.so skel=/etc/skel

无论在/etc/login中的默认设置如何,useradd命令都不会自动创建家目录。如果您想要为系统账户创建一个家目录,您必须指定-m选项。

使用 adduser
DESCRIPTION

 adduser  and  addgroup  add users and groups to the system according to
   command    line    options    and    configuration    information    in
   /etc/adduser.conf.   They  are  friendlier  front ends to the low level
   tools like useradd, groupadd and usermod programs, by default  choosing
   Debian  policy conformant UID and GID values, creating a home directory
   with skeletal configuration, running a custom script,  and  other  fea‐
   tures.  adduser and addgroup can be run in one of five modes:

useradd你必须自己添加所有选项,包括权限和其他一些内容。adduser根据合理的默认设置执行此操作(并且还会自动添加主目录)。

如果你需要使用adduser,可能需要将-b选项与-d选项一起使用!