如何从 CLI 中使用 PHP 获取服务器 IP 地址?

问题描述 投票:0回答:7

标题几乎概括了一切:

如何使用 PHP 从 CLI 获取服务器 IP 地址?

使用 PHP 的 CLI,$_SERVER 不包含服务器的 IP 地址,因此显然的解决方案是不可能的。

谢谢!

php
7个回答
12
投票

这段代码将获取 *nix 系统上接口“eth0”的 IP 地址。

// get the local hosts ip address
$hostsipaddress = str_replace("\n","",shell_exec("ifconfig eth0 | grep 'inet addr' | awk -F':' {'print $2'} | awk -F' ' {'print $1'}"));

7
投票

问题是,在 CLI 上运行 PHP 时,不涉及任何网络活动,因此没有 IP 地址。您首先需要定义的是,您想要获得什么IP。

  • 运行脚本的客户端IP?
    不可能,因为没有“客户”。

  • 网络接口的本地IP?
    运行一些系统实用程序,例如

    ifconfig
    ,但如果服务器有多个网络接口,您可能会获得多个 IP。

  • a域的IP,它可能对应也可能不对应于您正在运行的服务器?
    使用

    gethostbyname()
    ,但您需要知道要查询哪个域。

  • 您所在网络/服务器的面向公众的 IP?
    您需要使用像 www.whatsmyip.org 这样的外部服务(请注意,他们不喜欢这样),它会告诉您您的请求来自哪个 IP。这个地址是否对应任何有用的东西是另一个话题。

底线是,如果您对

$_SERVER['REMOTE_ADDR']
$_SERVER['SERVER_ADDR']
感兴趣,它根本不适用于 CLI 运行的脚本。


3
投票

此时 PHP 不知道 IP,除非您 pass_thru() 或 exec() 像 ifconfig 这样的 shell 实用程序。我建议您重新考虑使用 CLI 来实现此目的。

在这种情况下,将 PHP CLI 视为“基本解释器”。


1
投票

因为我在搜索时发现了这个,所以我很快就把这个功能放在了一起。 可以使用更好的错误检查等,但它可以完成工作。也许其他人会发现它有用:

function get_external_ip() {
    $ch = curl_init("http://icanhazip.com/");
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $result = curl_exec($ch);
    curl_close($ch);
    if ($result === FALSE) {
        return "ERROR";
    } else {
        return trim($result);
    }
}

0
投票

我假设您在通过 PHP 处理连接时调用 PHP CLI 脚本。 如果是这种情况,您可以将 $_SERVER 的值作为命令行参数传递给 CLI 脚本。


0
投票

虽然 vrillusions 帖子很棒,但有一个更好的方法可以做到这一点,因为有两个原因(a)源页面可能并不总是只保留 ip,但是(他们最近修改了索引以包含 html),而我们现在可以指出对于机器人来说,使用 regex 来匹配页面上的 ip 并将其拉出会更容易。这是我想象的功能

function RemoteIP($source = 'http://canihazip.com'){
    $c = file_get_contents($source);
    $ip = false;
    if(preg_match('/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/', $c, $m)){
        $ip = $m[1];
    }
    return $ip;
}
print RemoteIP().PHP_EOL;

0
投票

最好的方法:

trim(shell_exec("ifconfig eth0 | grep -oP 'inet \K[\d.]+'"));
© www.soinside.com 2019 - 2024. All rights reserved.