![由于 shell 错误导致登录失败](https://linux22.com/image/47747/%E7%94%B1%E4%BA%8E%20shell%20%E9%94%99%E8%AF%AF%E5%AF%BC%E8%87%B4%E7%99%BB%E5%BD%95%E5%A4%B1%E8%B4%A5.png)
我经常运行最新版本的登录 shell (zsh)。昨天,最新的版本有缺陷,立即崩溃了。在终端中运行它并不是什么大问题,因为我有其他打开的终端运行稳定版本,因此我可以更正到有缺陷的 shell 的链接。然而,我愚蠢地重新启动,并在 /etc/passwd 中激活有缺陷的 shell,并且在到达登录提示时,由于有缺陷的 shell,无法登录。我想知道是否有某种方法可以解决这个问题,即设置后备 shell 的某种方法,或者让登录提示您输入另一个 shell,以防默认有缺陷......类似的事情。事实上,我重新启动到备份安装,并以这种方式进行修复,但这有点笨拙。
答案1
如果 shell 完全有缺陷,并且在调用时就因错误退出,您可以制作一个假 shell,它只是一个 POSIX shell 脚本,运行您的 shell 和/或退出代码,并将其自身作为后备。
#!/bin/sh
# this is usually some incredibly limited shell like dash
fallback_shell=/bin/sh
primary_shell="$(getent passwd `whoami` | cut -d: -f7)"
"$primary_shell" || "$fallback_shell"
答案2
确保您可以以 root 身份登录。某些发行版禁止直接以 root 身份登录,但您只需为 root 帐户分配密码即可启用。这并非不安全(只需选择一个至少与您帐户的密码一样强的密码)。当然,不要在 root 帐户上使用实验性 shell(无论如何,您都不应该在该帐户上执行复杂的操作)。
为了更加安全,您可以在用户数据库中为同一用户创建一个附加条目。您可以/etc/passwd
使用相同的用户 ID(因此它是同一用户)但不同的用户名(以便在登录提示符下区分它们)、不同的主目录和不同的登录 shell 来创建多个条目。要创建此类条目,请/etc/passwd
通过运行命令进行编辑vipw
,复制您帐户的条目,然后更改第二个条目的用户名和登录 shell。然后运行vipw -s
修改密码文件( /etc/shadow
);复制您帐户的条目并更改用户名,但保留密码。
例如,这些是 my 的前两行/etc/passwd
(sash
是一个静态链接的 shell,带有一些额外的内置命令,有利于系统修复):
root:x:0:0:root:/root:/not/bin/sh
sashroot:x:0:0:root:/root:/bin/sash