2

PHP 中有没有办法找出远程服务器的 Linux 发行版名称?

从中提取$_SERVER['HTTP_USER_AGENT']的只是客户端机器的操作系统名称。这不是我想要的。我试过php_uname()

echo 'Operating System: '.php_uname('s').'<br>'; // echo PHP_OS;
echo 'Release Name: '.php_uname('r').'<br>';
echo 'Version: '.php_uname('v').'<br>';
echo 'Machine Type: '.php_uname('m').'<br>';

但该模式s只返回内核类型——Linux。

Operating System: Linux
Release Name: 2.6.32-431.29.2.el6.x86_64
Version: #1 SMP Tue Sep 9 21:36:05 UTC 2014
Machine Type: x86_64

我想知道是 Fedora、CentOS 还是 Ubuntu 等。有可能吗?我也尝试过posix_uname(),但出现错误。

致命错误:调用未定义函数 posix_uname()

4

3 回答 3

2

在 Linux 系统上,通常有类似/etc/lsb-release/etc/os-release包含有关发行版信息的文件。

您可以在 PHP 中阅读它们并提取它们的值:

if (strtolower(substr(PHP_OS, 0, 5)) === 'linux')
{
    $vars = array();
    $files = glob('/etc/*-release');

    foreach ($files as $file)
    {
        $lines = array_filter(array_map(function($line) {

            // split value from key
            $parts = explode('=', $line);

            // makes sure that "useless" lines are ignored (together with array_filter)
            if (count($parts) !== 2) return false;

            // remove quotes, if the value is quoted
            $parts[1] = str_replace(array('"', "'"), '', $parts[1]);
            return $parts;

        }, file($file)));

        foreach ($lines as $line)
            $vars[$line[0]] = $line[1];
    }

    print_r($vars);
}

(不是最优雅的 PHP 代码,但它完成了工作。)

这会给你一个像这样的数组:

Array
(
    [DISTRIB_ID] => Ubuntu
    [DISTRIB_RELEASE] => 13.04
    [DISTRIB_CODENAME] => raring
    [DISTRIB_DESCRIPTION] => Ubuntu 13.04
    [NAME] => Ubuntu
    [VERSION] => 13.04, Raring Ringtail
    [ID] => ubuntu
    [ID_LIKE] => debian
    [PRETTY_NAME] => Ubuntu 13.04
    [VERSION_ID] => 13.04
    [HOME_URL] => http://www.ubuntu.com/
    [SUPPORT_URL] => http://help.ubuntu.com/
    [BUG_REPORT_URL] => http://bugs.launchpad.net/ubuntu/
)

ID字段最适合确定发行版,因为它由 Linux 标准库定义,并且应该出现在常见发行版中。

顺便说一句,我建议不要使用exec()system()读取文件,因为出于安全原因,它们在许多服务器上被禁用。(另外,它没有意义,因为 PHP 可以原生读取文件。如果它不能读取它们,那么通过系统调用也将不可能。)

于 2014-11-11T11:25:49.660 回答
2

尝试一个 PHPsystem($call)调用http://php.net/manual/en/function.system.php 你可以在 ubuntu 系统上做任何你想做的事情来找到所需的信息,例如你可能想要使用system('cat /etc/issue'); 你可能想要使用一种方法,从 PHP 调用 bash 脚本,例如https://unix.stackexchange.com/questions/6345/how-can-i-get-distribution-name-and-version-number-in-一个简单的shell脚本

于 2014-11-11T11:14:51.017 回答
-1

上面提到的可能重复的问题是找出分布的代价。我使用exec()并执行命令得到了一个快速简单的解决方案:

$cmd = 'cat /etc/*-release';
exec($cmd, $output);
print_r($output);

然后,它的结果。

Array
(
    [0] => CentOS release 6.6 (Final)
    [1] => CentOS release 6.6 (Final)
    [2] => CentOS release 6.6 (Final)
)

致谢:HowTo:找出我的 Linux 发行版名称和版本

于 2014-11-11T11:25:34.317 回答