【问题标题】:Check IP address off a list using ksh/bash使用 ksh/bash 从列表中检查 IP 地址
【发布时间】:2021-04-27 05:28:05
【问题描述】:

我有一个包含以下数据的列表(文本文件):

app1 example1.google.com   
app2 example2.google.com  
dev1 device1.google.com  
cell1 iphone1.google.com

我想检查 URL/主机名的 ip 地址并使用收集的 ip 更新文本文件。示例:

app1 example1.google.com 192.168.1.10  
app2 example2.google.com 192.168.1.55  
dev1 device1.google.com 192.168.1.53  
cell1 iphone1.google.com 192.168.1.199

【问题讨论】:

    标签: bash scripting logfile shell ksh


    【解决方案1】:

    您可以使用dig 获取IP(但域必须存在)。未针对 IPv6 进行测试。

    #! /bin/bash
    while read name url ; do
        ip=$(dig -4 $url | grep '^[^;]' | grep -o '\([0-9]*[.:]\)\+[0-9.:]*$')
        printf '%s %s %s\n' "$name" "$url" "$ip"
    done < data.txt
    

    【讨论】:

    • dig without record type 无论如何都会查询A,因此不会出现 IPv6。您需要使用AAAA 运行它,然后正则表达式当然不匹配。
    • 以这种方式解析dig 输出不是一个好主意,太脆弱了。 dig 输出是针对人类的,不是针对计算机的。您至少应该使用+short+noall +ans 来限制事物。较新版本的dig 有一个+yaml 选项以结构化方式获取输出。这将是任何有意义的后期处理的最佳选择。
    【解决方案2】:

    如果文件中只有两列,这可能会有所帮助:

    awk '{"dig +short " $2 | getline ip ; print $1, $2, ip}' file

    首先,我们运行一个子shell(对数以万计的记录运行它并不是一个好主意),并在其中运行一个“dig +short”(我想到的仅获取 IP 地址的最短可能性),其 FQDN 为一台机器(在第二列中找到)。然后我们打印所有原始列和新列(带有 IP 地址)。可以使用单个 &gt; 将输出重定向到新文件。我不会认为编辑原始文件是“安全的”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 2013-07-18
      • 2014-05-25
      • 1970-01-01
      • 2012-04-14
      • 2016-04-21
      相关资源
      最近更新 更多