由于 shell 错误导致登录失败

由于 shell 错误导致登录失败

我经常运行最新版本的登录 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/passwdsash是一个静态链接的 shell,带有一些额外的内置命令,有利于系统修复):

root:x:0:0:root:/root:/not/bin/sh
sashroot:x:0:0:root:/root:/bin/sash

相关内容