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

BASH从shadow到变量获取salt和加密的根密码,bash,passwords,root,shadow,Bash,Passwords,Root,Shadow,我正在寻找一种方法,将用户输入的密码与保存在/etc/shadow中的root用户密码进行比较 我可以使用perl命令来完成这项工作,但我需要从shadow获取salt和现有密码以进行比较 我知道我可以grep/etc/shadow for root,结果是一个类似于以下内容的字符串: mal:$6$23QKDPc5E$SWlkjRWexrXYgc98F.:12825:0:90:5:30:13096: 我想做的是获取salt 23QKDPc5E和密码SWlkjRWexrXYgc98F。从这个字符

我正在寻找一种方法,将用户输入的密码与保存在/etc/shadow中的root用户密码进行比较

我可以使用perl命令来完成这项工作,但我需要从shadow获取salt和现有密码以进行比较

我知道我可以grep/etc/shadow for root,结果是一个类似于以下内容的字符串:

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

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

有没有一个简单的方法

我能想到的唯一方法是在$上拆分字符串,然后在以下位置拆分最终结果:

这将给我两个数组,其中包含我需要的值,但必须有一种更整洁的方法

感谢使用awk:

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

23QKDPc5E


grep root /etc/shadow | awk -F'$' '{print $4}' | awk -F: '{print $1}'
23QKDPc5E$SWlkjRWexrXYgc98F.
输出:

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}"
使用awk:

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

23QKDPc5E


grep root /etc/shadow | awk -F'$' '{print $4}' | awk -F: '{print $1}'
23QKDPc5E$SWlkjRWexrXYgc98F.
输出:

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}"

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

# 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中的散列字段本身由三个不同的字段组成。它们用“$”分隔,表示:

表示用于生成实际哈希的加密哈希机制的某些字符 一种随机生成的盐,用于防御彩虹表攻击 将用户密码与存储的salt连接并通过第一个字段中指定的散列机制运行所产生的散列
关于/etc/shadow文件格式的原始来源可以找到忽略过期的HTTPS证书警告

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

# 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中的散列字段本身由三个不同的字段组成。它们用“$”分隔,表示:

表示用于生成实际哈希的加密哈希机制的某些字符 一种随机生成的盐,用于防御彩虹表攻击 将用户密码与存储的salt连接并通过第一个字段中指定的散列机制运行所产生的散列 可以找到有关/etc/shadow文件格式的原始来源忽略过期的HTTPS证书警告