为什么即使以 root 身份运行,`su` 也会给出“su:身份验证失败”?

Vi.*_*Vi. 5 authentication su

有点像如何抑制 su 身份验证失败警告?,但它实际上根本不运行该命令。

# su limited
su: Authentication failure
# su -s /bin/bash limited
su: Authentication failure
# su -s /bin/bash - limited
su: Authentication failure
Run Code Online (Sandbox Code Playgroud)

为什么从 root 运行时需要检查身份验证?


对于大多数用户来说su确实可以正常工作。

# grep limited /etc/passwd
limited:x:1001:1001::/home/limited:/bin/bash
# grep limited /etc/shadow
#
Run Code Online (Sandbox Code Playgroud)

失踪并/etc/shadow不能阻止大多数其他用户被su加入。

当我尝试时,我看到日志条目:

Apr 21 10:43:18 thehostname su: FAILED SU (to limited) root on pts/110
Run Code Online (Sandbox Code Playgroud)
# egrep -v '^#|^$' /etc/pam.d/su
auth       sufficient pam_rootok.so
session       required   pam_env.so readenv=1
session       required   pam_env.so readenv=1 envfile=/etc/default/locale
session    optional   pam_mail.so nopen
session    required   pam_limits.so
@include common-auth
@include common-account
@include common-session
Run Code Online (Sandbox Code Playgroud)

roa*_*ima 7

x在 的(大部分已过时)密码字段中有一个/etc/passwd。根据man 5 passwd(在我的 Debian/Raspbian 机器上以及在线),这意味着中必须有相应的条目/etc/shadow

\n
\n

如果密码字段是小写\xe2\x80\x9cx\xe2\x80\x9d,则加密后的密码实际上存储在shadow(5)文件中;中必须有相应行/etc/shadow file,否则用户帐户无效。

\n
\n

我怀疑您触犯了最后一条“用户帐户无效”,并且su过于谨慎。

\n

示例 (Raspbian),所有命令均以 root 身份运行

\n
grep test.: /etc/passwd\ntest1:x:1005:1005:Test 1:/home/test1:/bin/bash\ntest2:x:1006:1006:Test 2:/home/test2:/bin/bash\n\ngrep test.: /etc/shadow\ntest1:!:18373:0:99999:7:::\n\nsu test1 -c id\nuid=1005(test1) gid=1005(test1) groups=1005(test1)\n\nsu test2 -c id\nsu: Authentication failure\n
Run Code Online (Sandbox Code Playgroud)\n

解决方案似乎是不在密码字段x中使用passwd或在 中添加相应的条目/etc/shadow。(请注意,将密码字段设置为/etc/passwd空可能会允许用户无需密码即可登录。相反,请使用!,这会将帐户标记为锁定。)

\n

您应该能够使用该pwconv命令来修复/etc/shadow缺少条目的文件。

\n

  • @Vi。删除“x”将允许任何人以该用户身份登录而无需任何密码(至少从控制台,Ctrl-Alt-F3并输入用户名;ssh或su可能更挑剔并拒绝接受)。不要那样做。用手去弄乱这些东西是个坏主意。__NB__ 在普通 Debian 10 上,“su”不会抱怨,并且让任何人成为用户,如果该用户在“/etc/passwd”中的密码字段为空。 (3认同)