我正在寻找一种方法来将用户输入的密码与存储在/etc/shadow
我可以使用perl命令执行此操作,但我需要从shadow中获取salt和现有密码以进行比较。
我知道我可以grep /etc/shadow
为root,这会产生类似于:
mal:$6$23QKDPc5E$SWlkjRWexrXYgc98F.:12825:0:90:5:30:13096:
我想做的是从这个字符串中获取盐 23QKDPc5E 和密码 SWlkjRWexrXYgc98F。到他们自己的变量。
有一种简单的方法吗?
我能想到的唯一方法是将字符串拆分为$
,然后将最终结果拆分为:
这将给我两个包含我需要的值的数组,但必须有一个更简洁的方式..
由于
答案 0 :(得分:2)
在@Viktor Khilin的回答中提出的类似方法,但只发出1个命令:
# Get the algorithm used for generating the password for user "root", first field of the hash in `/etc/shadow`
awk -F[:$] '$1 == "root" {print $3}' /etc/shadow
# Get the SALT, 2nd field of the hash in `/etc/shadow`:
awk -F[:$] '$1 == "root" {print $4}' /etc/shadow
# get the password hash, 3rd field in `/etc/shadow`:
awk -F[:$] '$1 == "root" {print $5}' /etc/shadow
说明:
/etc/shadow
中的哈希字段本身由三个不同的字段组成。它们用'$'分隔,代表:
可以找到有关/etc/shadow
文件格式的原始来源here(忽略过期的HTTPS证书警告)
答案 1 :(得分:1)
使用awk:
grep root /etc/shadow | awk -F'$' '{print $3}'
输出:
23QKDPc5E
grep root /etc/shadow | awk -F'$' '{print $4}' | awk -F: '{print $1}'
输出:
23QKDPc5E$SWlkjRWexrXYgc98F.
最后代码:
#!/bin/bash
# something you want here...
salt=$(grep root /etc/shadow | awk -F'$' '{print $3}')
password=$(grep root /etc/shadow | awk -F'$' '{print $4}' | awk -F: '{print $1}')
...
echo "${salt}"
echo "${password}"