无法使用 su 命令以其他用户身份交互式登录

Ala*_*a S 7 password login su 20.04

我目前使用的是 ubuntu 20.04 机器。我使用命令创建了一个带有密码的用户useradd。我需要更改PATH该用户的变量。所以我曾经su - <username>以交互方式登录到用户的外壳。当它要求输入密码时,我提供了用户的密码。但我收到以下错误。

ubuntu@ip-172-31-49-109:~$ su - harry
Password: 
su: Authentication failure
Run Code Online (Sandbox Code Playgroud)

有谁知道我该如何解决这个问题以及如何更改PATH用户的变量

Raf*_*ffa 7

我使用命令创建了一个带有密码的用户useradd

好吧,我会相信你的话......即你尝试仅 使用......创建一个带有密码的新用户useradd......尝试想象你如何尝试......可能使用该-p, --password选项并以纯文本形式提供密码,如下所示:

$ sudo useradd -p PASSWORD harry
Run Code Online (Sandbox Code Playgroud)

好吧,这是行不通的,因为提供的密码应该是加密密码,如下所示man useradd

 -p, --password密码

加密的密码,由crypt(3)返回。
默认是禁用密码。

注意:不推荐此选项,因为密码
(或加密密码)将被列出进程的用户看到。

您应该确保密码符合系统的密码策略。

因此,您输入的密码(在与存储的用户密码“散列”进行比较之前将被散列/加密)实际上并不是系统存储/期望的密码,并且错误su: Authentication failure实际上就是它的含义,因为密码不能被以这种方式进行身份验证/匹配...su - harry如果您使用更改密码sudo passwd harry然后尝试su - harry后记,应该可以正常工作。

此外,正如man useradd上面摘录中所述,这不是为用户设置密码的推荐方法。

推荐的方法是passwd在创建用户后设置密码,如下所示:

sudo passwd harry
Run Code Online (Sandbox Code Playgroud)

这是...使用的方法,adduser这是一个前端用户友好的 Perl 脚本,useradd您可以使用以下命令进行检查:

cat /usr/sbin/adduser
Run Code Online (Sandbox Code Playgroud)

passwd通过调用此代码摘录中的系统可执行文件来找出它是如何做到这一点的:

。
。
。
    如果($ask_passwd){
    为了 (;;) {
       我的 $passwd = &which('passwd');
    # 不要在这里使用 systemcall(),因为 systemcall() 会死掉
    # 非零退出代码,我们需要在这里进行特殊处理!
      系统($passwd,$new_name);
    我的 $ok = $?>>8;
    如果($好!= 0){
。
。
。

后果

使用useradd不使用并向-d,-m-soptions提供有效/正确的参数)创建新用户后,即不是这样:

sudo useradd -s /bin/bash -d /home/harry -m harry
Run Code Online (Sandbox Code Playgroud)

然后,您很可能最终没有新用户的主目录,并且具有dash定义的默认值/bin/shuseradd -D),而不是bash新用户的默认登录 shell ...因此,您可能需要:

  1. 以正确的方式为新用户创建主目录,如下所示:

    sudo mkhomedir_helper harry
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将新用户的登录 shell 更改为bash如下所示:

    sudo chsh -s /bin/bash harry
    
    Run Code Online (Sandbox Code Playgroud)

下次您创建新用户时,请使用它,adduser因为它是一个用户友好的命令,并且将处理上述所有内容。

  • @AlakanandaS `useradd` 的 `-d` 选项指定主目录是...但是,如果它不存在则不会创建它“请参阅手册页”...您需要在指定的路径中创建它: ) (2认同)

Art*_*ild 5

您可以使用以下命令:

sudo -i -u harry
Run Code Online (Sandbox Code Playgroud)

如果要求输入密码,请输入您自己的密码(而不是 Harry 的密码)。因此,它将允许您在没有设置密码的情况下登录用户帐户(例如root默认情况下)。

参数(来自man sudo):

-i运行由目标用户的密码数据库条目指定的 shell 作为登录 shell。这意味着shell 将读取特定于登录的资源文件(例如.profile或 ) 。.login

-u以默认目标用户(通常为 )以外的用户身份运行该命令root