BASH 从 shadow 获取 salt 和加密的 root 密码到变量

BASH get salt and encrypted root password from shadow to variable

我正在寻找一种方法来将用户输入脚本的密码与存储在 /etc/shadow

中的根用户密码进行比较

我可以使用 perl 命令执行此操作,但我需要从 shadow 获取 salt 和现有密码以进行比较。

我知道我可以用 grep /etc/shadow 获取根目录,这会产生类似于以下内容的字符串:

mal:QKDPc5E$SWlkjRWexrXYgc98F.:12825:0:90:5:30:13096:

我想做的是从这个字符串中获取盐 23QKDPc5E 和密码 SWlkjRWexrXYgc98F. 到他们自己的变量。

有简单的方法吗?

我能想到的唯一方法是在 $ 上拆分字符串,然后在 :

上拆分最终结果

这将给我两个包含我需要的值的数组,但必须有更简洁的方法..

谢谢

使用 awk:

grep root /etc/shadow | awk -F'$' '{print }'

输出:

23QKDPc5E


grep root /etc/shadow | awk -F'$' '{print }' | awk -F: '{print }'

输出:

23QKDPc5E$SWlkjRWexrXYgc98F.

最后代码:

#!/bin/bash

# something you want here...

salt=$(grep root /etc/shadow | awk -F'$' '{print }')
password=$(grep root /etc/shadow | awk -F'$' '{print }' | awk -F: '{print }')
...
echo "${salt}"
echo "${password}"

@Viktor Khilin 的回答中提出的类似方法,但仅发出 1 个命令将是:

# Get the algorithm used for generating the password for user "root", first field of the hash in `/etc/shadow`
awk -F[:$] ' == "root" {print }' /etc/shadow

# Get the SALT, 2nd field of the hash in `/etc/shadow`:   
awk -F[:$] ' == "root" {print }' /etc/shadow

# get the password hash, 3rd field in `/etc/shadow`:
awk -F[:$] ' == "root" {print }' /etc/shadow

解释:

/etc/shadow 中的哈希字段本身由三个不同的字段组成。它们以'$'分隔,代表:

  1. 代表用于生成实际散列的加密散列机制的一些字符
  2. 一种随机生成的盐来抵御彩虹 table 攻击
  3. 通过第一个字段中指定的散列机制
  4. 将用户密码与存储的 salt 和 运行 结合起来产生的散列

可以找到关于 /etc/shadow 文件格式的原始来源 here(忽略过期的 HTTPS 证书警告)