使用 sed 恢复用户密码哈希

使用 sed 恢复用户密码哈希

该问题的版本信息如下:

root@hypervisor:~# uname -a
Linux hypervisor 4.4.35-1-pve #1 SMP Fri Dec 9 11:09:55 CET 2016 x86_64 GNU/Linux
root@hypervisor:~# cat /etc/debian_version
8.9
root@hypervisor:~#

由于 Linux 容器往往会被频繁创建/销毁,因此我需要想出一种方法来保存这些容器上用户帐户的密码。

为此,我/etc/shadow在销毁容器之前会进行保存。当重新部署容器时,我会在重新创建的 Linux 容器上执行以下操作:

#!/bin/bash

HASH_TO_REPLACE=$(grep testuser /etc/shadow)
HASH_TO_RESTORE=$(grep testuser /root/shadow_SAVE)

echo "HASH_TO_REPLACE: $HASH_TO_REPLACE"
echo "HASH_TO_RESTORE: $HASH_TO_RESTORE"

sed -i "s!$HASH_TO_REPLACE!$HASH_TO_RESTORE!" /etc/shadow

这似乎很有效。但有一件事令我担心:

据我所知,它!永远不会出现在(未禁用的)密码哈希中。因此,我sed暂时将其用作分隔符。但是密码可能被禁用(在这种情况下!会出现在影子文件中),这意味着!不应将其用作sed分隔符。还有哪些字符可以保证永远不会出现在密码哈希中,因此可以安全地用作 sed 分隔符?

答案1

以下字符用于在 Debian 8 中对密码哈希进行编码(我的用例;这很可能在现代 Linux 实现中广泛适用):

./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

任何不在该集合中的字符并且不是感叹号(用于表示禁用的密码)都可以用作 sed 分隔符。

相关内容