【问题标题】:nslookup for IP & replace the result FQDN with IPnslookup 获取 IP 并将结果 FQDN 替换为 IP
【发布时间】:2018-07-24 14:56:07
【问题描述】:

要求

我有一个 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/*

【问题讨论】:

  • 欢迎来到 Stack Overflow,请在您的帖子中添加 3 个简单的内容。 1-您对所有要求有什么问题。 2- 代码标签中的样本输入。 3- 预期的示例输出以及您尝试获得的内容。
  • @RavinderSingh13 -- 感谢您提供的信息。我试图编辑我的问题并详细说明。如果现在格式正确,请告诉我

标签: bash suse


【解决方案1】:

这是一个在纯 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,因此您可能只想为该功能安装它。

【讨论】:

    【解决方案2】:

    解决方案 1: 在单个 awk 内讨论 cmets 现在添加此内容:

    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
    

    解决方案 2: 这是我使用 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"
    

    【讨论】:

    • 这太可怕了。为什么你将东西捕获到变量中,然后echo 结果又出来了?该函数应该使用带有小写或混合大小写名称的local 变量,或者当然,在这种情况下,根本没有变量。将两个 Awk 脚本组合成一个脚本也不难。
    • @RavinderSingh13 -- 非常感谢。该脚本只需少量修改即可完美运行:)
    • @tripleee :- Ravinder 的脚本确实有效。虽然整个 nslookup 过程需要一点时间。我只是在一个示例文件上运行它,IP 被 FQDN 替换。例如url=c8.05.2fa9.ip4.static.sl-reverse.com.:443 url=55.f3.25ae.ip4.static.sl-reverse.com.:443 url=55.f3.25ae.ip4.static.sl-reverse.com.:443
    • 我的 cmets 与效率、风格和惯例有关,而不是最终结果是否符合您的期望。
    • 我一般会尽量避免使用echo | awk。 awk 解析文件比while read 更快更方便。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 2011-06-05
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多