nslookup for IP&用IP替换结果FQDN

时间:2018-02-14 05:38:57

标签: bash suse

要求

我有一个txt文件,其中最后一列有URL。 某些URL条目具有IP而不是FQDN。 因此,对于具有IP的条目(例如url = https://174.37.243.85:443 *),我需要对IP执行反向nslookup并将结果(FQDN)替换为IP。

文本文件输入

httpMethod=SSL-SNI destinationIPAddress=174.37.243.85 url=https://174.37.243.85:443*
httpMethod=SSL-SNI destinationIPAddress=183.3.226.92 url=https://pingtas.qq.com:443/*
httpMethod=SSL-SNI destinationIPAddress=184.173.136.86 url=https://v.whatsapp.net:443/*

预期产出

httpMethod=SSL-SNI destinationIPAddress=174.37.243.85 url=https://55.f3.25ae.ip4.static.sl-reverse.com:443/*
httpMethod=SSL-SNI destinationIPAddress=183.3.226.92 url=https://pingtas.qq.com:443/*
httpMethod=SSL-SNI destinationIPAddress=184.173.136.86 url=https://v.whatsapp.net:443/*

2 个答案:

答案 0 :(得分:2)

这是纯粹的Awk的快速而肮脏的尝试。

awk '$3 ~ /^url=https?:\/\/[0-9.]*([:\/?*].*)?$/ {
    # Parse out the hostname part
    split($3, n, /[\/:?\*]+/);
    cmd = "dig +short -x " n[2]
    cmd | getline reverse;
    sub(/\.$/, "", reverse);
    close(cmd)
    # Figure out the tail after the hostname part
    match($3, /^url=https:?\/\/[0-9.]*/); # update index
    $3 = n[1] "://" reverse substr($3, RSTART+RLENGTH) } 1' file

如果您没有dig,则可能需要求助于nslookuphost;但可移植提供正确的机器可读输出的唯一一个是dig,因此您可能希望仅为该功能安装它。

答案 1 :(得分:1)

解决方案第一: 在讨论评论后的单awk内添加此内容:

awk '
{
 if(match($0,/\/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/)){
   val_match=substr($0,RSTART+1,RLENGTH-1);
   system("nslookup " val_match " > temp")};
 val=$0;
 while(getline < "temp"){
   if($0 ~ /name/){
     num=split($0, array," ");
     sub(/\./,"",array[num]);
     sub(val_match,array[num],val);
     print val}}
}
NF
'   Input_file

解决方案第二: 这是我使用awk和shell的初始解决方案。 以下简单的脚本可以帮助您:

cat script.ksh
CHECK_IP () {
    fdqn=$(echo "$1" | awk '{if(match($0,/\/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/)){system("nslookup " substr($0,RSTART+1,RLENGTH-1))}}')
    actual_fdqn=$(echo "$fqdn" | awk '/name/{sub(/\./,""$NF);print $NF}')
    echo "$actual_fdqn"
}

while read line
do
        val=$(CHECK_IP "$line")
        if [[ -n "$val" ]]
        then
                echo "$line" | awk -v var="$val" '{if(match($0,/\/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/)){ip_val=substr($0,RSTART+1,RLENGTH-1);sub(ip_val,var)}} 1'
        else
                echo "$line"
        fi
done < "Input_file"