无法登录新创建的用户账户

尝试切换到我新创建的账户时,屏幕变黑然后输入正确密码后又回到了主登录界面。
登录我的之前存在的账户后,我看到:
"System Program Problem Detected"

Details:

Executable path /usr/bin/Xorg

Package: xserver-xorg-core 2:1.11.4-0ubuntu10.1

Details: Crash
... (tons more, but no way to copy paste or save)

当我尝试使用su命令时
su -l penner

我明白。
No directory, logging in with HOME=/

我手动创建了主目录,这个错误消失了,但是登录还是没有成功。似乎用户创建出了问题?我该如何纠正这个问题?

你是怎么创建用户账户的?是通过图形界面还是命令行?如果是通过命令行,你需要知道adduser和useradd的操作方式有很大不同。另外,似乎/etc/skel目录下的文件没有被复制过来。能否请你在你的主目录和新用户的目录下执行ls -al命令,这样我们可以看看出了什么问题? - SuperMatt
3个回答

如果您使用useradd创建了用户账户,那么您需要手动设置所有相关内容。这就是为什么在命令行创建用户账户时,建议在Ubuntu(以及Debian和其他基于Debian的系统)中使用adduser。您可以使用userdeldeluser删除用户,并使用adduser重新创建用户。否则...

修复主目录位置

如果您想保留用户账户并解决问题,那么您需要查看:

  • 用户账户实际配置的家目录名称
  • 您实际创建的目录名称

这两个名称必须完全相同。您在使用 su -l penner 命令时收到的错误消息表明它们不同。

要检查用户账户实际配置的家目录,请运行以下命令(有关更多信息,请参阅 man 5 passwdman grep):

grep penner /etc/passwd

你应该看到这样一行:
penner:x:1000:1000:Eliah Kagan,,,:/home/penner:/bin/bash

那就是说,第六个以冒号分隔的字段(在第五个冒号之后)包含了主目录。如果它不是“/home/penner”,那么应该是这样。如果你为用户创建的目录不是“/home/penner”,那也应该是这样。如果这两个目录相同,但都不是“/home/penner”,那理论上可能会工作,但你应该将它们都设置为“/home/penner”,因为很多软件假设所有非root用户的主目录都是“/home/username”。
你可以通过运行以下命令将penner的主目录更改为“/home/penner”:
sudo usermod -d /home/penner penner

查看更多信息,请参阅man usermod
确保它是一个目录,并且用户有访问权限
如果(或一旦)名称都是/home/penner,您还应确保用户可以访问自己的主目录。运行:
ls -ld /home/penner

你应该看到类似这样的东西(尽管日期和时间会不同):
drwxr-xr-x 43 penner penner 4096 2012-07-03 06:41 /home/penner

如果你的权限不是以drwxr-xr-x开头,而是以-开头,那么你创建的是一个文件而不是目录。请删除该文件并创建一个目录。
如果第一个penner不是这样的话,那么用户没有拥有自己的主目录,所以请让他们拥有它。
sudo chown penner /home/penner

查看更多信息,请参阅man chown
如果在d之后的下一个三个字符中有破折号,那么用户在那里没有完全访问权限。请按以下方式修复:
sudo chmod u+rwx /home/penner

请参考man chmod以获取更多信息。
(如果您愿意,penner可以运行此命令,前提是他们拥有自己的主目录。您可以这样运行:sudo -u penner u+rwx /home/penner
确保其他用户没有全面写入权限
如果最后六个字母中有w而不是-,那么除了penner之外的用户可能对penner的主目录具有写入权限。这是危险的(除非您真的知道自己在做什么,并且希望它保持这种方式,并且已经设置好了以避免问题)。要修复它:
sudo chmod -R go-w /home/penner

其他默认设置

您可能希望进行一些其他更改。在Ubuntu中,默认情况下(即,如果您使用adduser或图形工具创建用户帐户,而不是其他方式):

  1. 家目录对所有人都有读写权限,而不仅仅是拥有者。 用户可以更改这一设置,无论是对整个家目录还是其中的任何文件和子目录。但如果您希望保持默认设置,并且在 drwxr-xr-x 中没有第二个和第三个 rx,请运行以下命令:

    sudo chmod 755 /home/penner
    

    (如果 penner 拥有自己的家目录并且具备运行此命令的能力,您也可以使用以下命令运行:sudo -u penner chmod 755 /home/penner)

  2. 每个用户都有自己的组,与用户名相同,这是用户的主要组。他们的家目录归该组所有。这就是 drwxr-xr-x 43 penner penner 4096 2012-07-03 06:41 /home/penner 中第二个 penner 的含义。如果您知道自己在做什么,可以打破这个默认设置。但如果您不打算进行不同的操作,应确保 penner 是以这种方式设置的,因为用户的主要组身份或用户家目录的组所有者可能会导致安全问题。

    运行 groups penner。(有关更多信息,请参见 man groups。)您应该看到类似于以下内容:

    penner : penner adm dialout cdrom plugdev lpadmin sambashare
    

    如果不完全相同,不要担心。我很快会解释。而是看一下 : 后面的第一个单词。那就是用户的主要组名。假设您希望它是 penner,请确保如此。如果不是,请进行更改:

    sudo usermod -g penner penner
    

    如果出现指示组 penner 不存在的错误,则需要使用以下命令创建它(然后再次运行上述命令):

    sudo addgroup penner
    
    • 有关更多信息,请参见 man addgroup。(如果愿意,您也可以使用 groupadd 命令创建组。)
  3. 当您运行 groups penner 时,您可能得到的组列表比我的 penner : penner adm dialout cdrom plugdev lpadmin sambashare 要短得多。对于桌面用户,admdialoutcdromplugdevlpadminsambashare 提供了桌面用户通常应该具备的功能。因此,除非有特殊原因,penner 应该属于这些组。然而,这些不是主要组,所以设置方式不同。假设 penner 不属于任何这些组,并且您希望 penner 属于所有这些组,请运行以下命令:

    sudo usermod -a -G adm,dialout,plugdev,lpadmin,sambashare penner
    

    如果您感兴趣,以下是所有这些组的含义:

    将用户设为管理员

    如果你不想让 penner 成为管理员,那么你可能不需要做其他任何事情。你可以通过运行 groups penner 来检查 penner 是否是管理员。如果既没有列出 admin 也没有列出 sudo,那么 penner 就不是管理员。

    如果你希望 penner 成为管理员,将 penner 添加到这两个组中的任意一个(如果两个组都存在,你也可以同时添加到两个组中)。你可以通过分别运行以下两个命令来实现:如果其中任何一个成功执行,就表示你已经将 penner 设为管理员:

    sudo usermod -a -G admin penner
    sudo usermod -a -G sudo penner
    

    有两个组的原因是,在Ubuntu 12.04 LTS之前,管理员属于“admin”组。从Ubuntu 12.04 LTS开始,管理员属于“sudo”组。但是,如果您的12.04 LTS系统是从以前的版本升级而来(这也适用于稍后发布的Ubuntu版本,比如12.10,它是从Ubuntu 11.10或更早版本升级而来),那么为了向后兼容,管理员同时是“sudo”和“admin”的成员。通常情况下,如果其中一个组没有管理权限,它就不存在,所以分别运行上述两个命令(不要使用“sudo usermod -a -G admin,sudo penner”)通常是使“penner”成为管理员的一种安全有效的方法。

1谢谢!像adduser这样的东西很好,但我也喜欢知道如何手动操作。非常详细的回答!我真的很感激。 - penner
在Ubuntu 16.04(Xenial)上,执行sudo chmod u+a /home/penner会出现错误。将其替换为sudo chmod u+rw /home/penner是否正确? - Nickolai Leschov
@NickolaiLeschov 对此表示抱歉,并感谢您指出错误!我已经修复了命令。 - Eliah Kagan
这真是愚蠢,为什么不把 useradd 删除掉呢?保留着一些乱七八糟的错误代码。 - dashesy
@EliahKagan adduser ----no-create-home就可以了。看起来不仅仅是设置一个家目录。在Ubuntu上,useradd可能会导致一些问题(例如设置shell)。而在Fedora上,useradd是可以的。 - dashesy
1@dashesy 谢谢你的回复。我之前并不知道在Ubuntu上使用useradd会导致问题,而在其他系统上却没有这个问题。在我的16.04系统中,/etc/default/useradd文件中只有一行被取消注释,内容是SHELL=/bin/sh。根据useradd(8)的说明,如果没有给出-s/--shell标志,那么就会使用/etc/default/useradd文件中的SHELL值作为默认值。但是在我的16.04系统上并没有发生这种情况。我之前匆忙地说Ubuntu的useradd没有问题是错误的。现在我不太确定了。也许Fedora、Debian(以及Ubuntu)之间存在这种差异是有充分理由的...但是为了不误导他人,我已经删除了我的评论。 - Eliah Kagan

这通常发生在您创建用户时没有为用户创建主目录的情况下。可以通过在创建用户时使用以下命令来解决这个问题。
useradd -m the_username

-m标志是用来为用户创建家目录的。在创建用户之后,通过执行以下操作来检查该用户的家目录是否存在:
ls /home

如果你能看到那个用户名在列表中,那么要做的最后一件事就是为该用户分配一个密码。
passwd the_username

你现在可以使用那个用户名和密码登录了。

按下ctrl+alt+f1并在那里登录,然后运行

sudo chown -R $USER:$USER $HOME

然后按下ctrl+alt+f7并尝试登录

它会起作用的