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