使用散列值替换文件中的匹配项

时间:2013-12-17 13:08:52

标签: regex bash sed awk

我偶然发现了一个我有一个大弱点的问题。我没有完成此任务所需的忍者bash,awk,sed等技能:

我正在使用Freeradius用户文件,您可以在其中为VPN客户端存储用户名,密码和其他设置。因此,此文件中的记录具有以下格式:

vpnclient       Cleartext-Password := "ComplexPassword"
                Service-Type = Outbound-User,
                Framed-IP-Address = 172.16.0.225,
                Framed-IP-Netmask = 255.255.255.255,
                Cisco-AVPair += "ipsec:inacl=IPSEC_EXTRANET",
                Cisco-AVPair += "ipsec:dns-servers=192.168.1.31 192.168.1.32",
                Cisco-AVPair += "ipsec:split-dns=mydomain.com",
                Cisco-AVPair += "ipsec:split-dns=yourdomain.com"

我想从这些位中提取Cleartext-Password := "ComplexPassword"位,并用相应的MD5哈希值替换密码。另外,我想同时将Cleartext-Password替换为MD5-Password。所以在处理之后我希望文件中的记录看起来像这样:

vpnclient       MD5-Password := "be2cb07387a0574f11772a5b3540845c"
                Service-Type = Outbound-User,
                etc.

所以,我只是想找到一个正则表达式匹配,处理它并在文件中插入它而不是原始值。我认为在许多其他案例中也很方便。问题是,我不知道是否有可能,例如,在sed和类似东西的替代部分使用外部命令或函数。

2 个答案:

答案 0 :(得分:2)

使用awk:

awk -F' *:= *' '$1~/Cleartext-Password/{gsub(/"/, "", $2); printf "%s := \"", $1;
    system("md5 <<< \"" $2 "\"|tr -d \"\\n\""); print "\"";next}1' vpnfile

vpnclient       Cleartext-Password := "be2cb07387a0574f11772a5b3540845c"
                Service-Type = Outbound-User,
                Framed-IP-Address = 172.16.0.225,
                Framed-IP-Netmask = 255.255.255.255,
                Cisco-AVPair += "ipsec:inacl=IPSEC_EXTRANET",
                Cisco-AVPair += "ipsec:dns-servers=192.168.1.31 192.168.1.32",
                Cisco-AVPair += "ipsec:split-dns=mydomain.com",
                Cisco-AVPair += "ipsec:split-dns=yourdomain.com"

答案 1 :(得分:2)

awk '/Cleartext-Password/{
    match($0,/"(.*)"/,a)
    passw=a[1]
   ("echo "passw " | md5sum") |& getline var
   split (var,b)
   sub(/".*"/,"\""b[1]"\"")
} 1 ' input.txt