该问题的版本信息如下:
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 分隔符。