我正在构建一个通常不会登录的嵌入式系统,但我们需要一种让开发人员可以进行调试和开发的方法。 rootfs 通常是只读的(但可以重新挂载为读写)。
我正在考虑的方案是保持 root 密码锁定(passwd -l
)。如果特殊文件存在(在可移动介质上),请解锁密码以便您可以登录。重新启动后,如果特殊文件不存在,密码将再次锁定。
该特殊文件未记录,最终用户不会使用。开发人员通常会创建此文件,以便他们可以随意登录。另一种登录方式是 ssh 客户端,它打开一个转发到我们的服务器的端口,允许我们使用基于密钥的身份验证进行 ssh 登录。为了开发,需要有一种没有网络也能进入的方式。
实现这一点的最简单方法似乎是这样的:
if passwd_is_locked and enable_login_exists:
remount_rw()
unlock_passwd()
remount_ro()
elif not passwd_is_locked and not enable_login_exists:
remount_rw()
lock_passwd()
remount_ro()
else:
pass
我不喜欢重新挂载和修改文件;我宁愿有一些暂时的备用配置(例如 中的某些内容/tmp
)。
我深入研究了这个passwd
命令。看起来它--repository
通过名称服务切换系统 ( ) 支持某些数据 ( )的多个源nsswitch.conf
。我不确定这是否是一个可行的选择,特别是对于 root 帐户,因为 root 帐户似乎应该始终回退到普通/etc/shadow
文件。我承认我不是一个系统管理员,所以也许我只是不理解它。
passwd
还有一个--root
选项。我只需通过cp -a /etc /lib /tmp && passwd --root /tmp
编辑/tmp
.我不确定我是否可以用这个做一些有用的事情。
如果我将/etc/passwd
et al 更改为指向某些可写区域的符号链接,并且如果我手动编辑文件,它似乎可以工作,但我无法使用该passwd
命令。
我没有使用 PAM,但如果有好的解决方案,我可能可以启用它。
答案1
我最终使用了类似的东西(在 initrd 内):
if is_dev_mode ; then
chroot $ROOTFS_MOUNT /usr/bin/passwd --delete root
else
chroot $ROOTFS_MOUNT /usr/bin/passwd --lock root
fi
sync
这发生在 rootfs 以只读方式重新挂载之前。我不太喜欢它,但我认为它比使用另一个 unionfs (已经有几个)更好。 initrdpasswd
没有主操作系统那样的花哨选项,但 achroot
也能正常工作。