我目前正在使用 ubuntu 20.04 机器。我使用命令创建了一个带密码的用户useradd
。我需要更改PATH
该用户的变量。所以我习惯su - <username>
以交互方式登录到用户的 shell。当它要求输入密码时,我提供了用户的密码。但我收到以下错误。
ubuntu@ip-172-31-49-109:~$ su - harry
Password:
su: Authentication failure
有谁知道我该如何解决这个问题,以及如何更改PATH
用户的变量
答案1
我使用该命令创建了一个带有密码的用户
useradd
。
好的,我相信你……例如,你尝试使用以下方式创建一个带有密码的新用户仅有的 useradd
... 试着想象你是如何尝试的... 可能使用选项-p, --password
并提供纯文本形式的密码,如下所示:
$ sudo useradd -p PASSWORD harry
嗯,这是行不通的,因为提供的密码应该是加密密码如所述man useradd
:
-p,--密码密码 返回的加密密码地穴(3)。 默认是禁用密码。 注意:不建议使用此选项,因为密码 (或加密密码)将对列出进程的用户可见。 您应该确保密码符合系统的密码策略。
因此,您输入的密码(在与存储的用户密码“hash”进行比较之前,它将被散列/加密) 实际上并不是系统存储/期望的密码,错误su: Authentication failure
实际上意味着密码无法通过这种方式进行验证/匹配......su - harry
如果您使用更改密码sudo passwd harry
然后重试,应该可以正常工作su - harry
。
此外,正如上面的摘录所述man useradd
,这不是为用户设置密码的推荐方式。
推荐的方法是使用passwd
创建用户后设置密码如下:
sudo passwd harry
这是使用的方法adduser
...这是一个前端用户友好的 Perl 脚本,useradd
您可以使用它进行检查:
cat /usr/sbin/adduser
passwd
通过调用此代码摘录中的系统可执行文件来发现它确实做到了这一点:
。 。 。 如果 ($ask_passwd) { 为了 (;;) { 我的 $passwd = &which('passwd'); # 不要在这里使用 systemcall(),因为 systemcall() 会在 # 非零退出代码,我们需要在这里做特殊处理! 系统($passwd,$new_name); 我的 $ok = $?>>8; 如果 ($ok != 0) { 。 。 。
后果:
使用后useradd
(未使用和提供有效/适当的参数给-d
、-m
和-s
选项)创建你的新用户,即不是像这样:
sudo useradd -s /bin/bash -d /home/harry -m harry
然后,您很可能最终会没有新用户的主目录,并且dash
(默认值/bin/sh
定义在useradd -D
)而不是bash
作为新用户的默认登录 shell...因此,您可能需要:
以正确的方式为新用户创建主目录,如下所示:
sudo mkhomedir_helper harry
将新用户的登录 shell 更改为
bash
如下形式:sudo chsh -s /bin/bash harry
下次创建新用户时,请使用adduser
它,因为它是一个用户友好的命令,并且可以处理上述所有操作。
答案2
您可以使用以下命令:
sudo -i -u harry
如果它要求输入密码,请输入您自己的密码(而不是哈利的)。因此,它将允许您使用不设置的密码(例如root
默认)。
参数(来自man sudo
):
-i
将目标用户的密码数据库条目指定的 shell 作为登录 shell 运行。这意味着登录特定的资源文件(例如.profile
或 ).login
将被 shell 读取。
-u
root
以默认目标用户(通常)以外的用户身份运行该命令。