在PHP中获取Linux发行版名称

时间:2014-11-11 10:43:59

标签: php linux operating-system linux-distro

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()

3 个答案:

答案 0 :(得分: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本身可以读取文件。如果它无法读取它们,那么它也无法通过系统调用来实现。)

答案 1 :(得分:1)

尝试使用PHP system($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-a-simple-shell-script

答案 2 :(得分:-1)

找到分布的上述

The possible duplicate question代价很高。我使用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: Find Out My Linux Distribution Name and Version