0

我在尝试读取包含由新行分隔的 IP 地址的文件时遇到此错误。我想要做的是阅读包含大量 IP 的文件并检查它们是否有正确的记录。这是我的代码:

$file = "test.sh";

if (is_file($file) && is_readable($file)) {
    $get_file_data = file_get_contents($file);

    $turn_to_array = explode("\n", $get_file_data);

    foreach ($turn_to_array as $key => $value) {

        if (filter_var($value, FILTER_VALIDATE_IP)) {
            echo gethostbyaddr(trim($value));
        } else {
            echo "IP invalid";
        }
    }
}

我的 test.sh 文件如下所示:

编辑:示例 IP

180.1.1.1
181.1.1.2

我需要添加一些特定的测试来解析文件还是有其他问题?

使用非常独特的方法引起的错误:

警告:gethostbyaddr():地址不是有效的 IPv4 或 IPv6 PHP

解决了。

我的代码正常工作,我没有正确获取 rdns 记录,因为这些 IP 不存在它。我用主机 185.1.1.1检查了它,它返回了实际的 IP 而不是域。然后检查我确信他们有 PTR 记录的 IP,然后它就醒了。但我不确定实际上是如何修复错误的。

4

1 回答 1

1

老实说,我认为爆炸原始文件数据并希望获得最好的结果可能不是实现这一目标的最佳方式。相反,您应该尝试使用正则表达式提取所需的确切数据,以便确定您提取的是正确的值。

尝试这样的事情:

$data = file_get_contents($file);

// This regex matches things that resemble an IP4 address
if (preg_match_all("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/", $data, $addresses)) {

    foreach ($addresses as $address) {

        // Need to verify it ACTUALLY is a valid IP address
        if (filter_var($address, FILTER_VALIDATE_IP)) { 

            echo gethostbyaddr($address);

        }

    }

}

注意:此处使用的正则表达式由@alex 编写:Regex to match an IP address

如果这没有帮助,则可能是配置问题。其他一些可能有助于排除故障的检查事项是:

  • gethostbyaddr('127.0.0.1');抛出同样的错误吗?
  • 您是否有阻止 DNS 请求通过的防火墙?
  • 您可以使用dig来自服务器的命令来查找 IP 吗?
于 2016-07-27T18:48:54.893 回答