以编程方式确定Ubuntu的分布和架构?

什么是以编程方式确定当前机器是否正在运行Ubuntu的最佳方式,它具有哪种体系结构以及它运行的是哪个版本的Ubuntu?

一种方法是扫描uname -a的输出uname -a以检查正确的内核版本和体系结构。

另一种方法是扫描/etc/apt/sources.list以获得Ubuntu分发关键字(eq precisequantal等)

有没有更好的办法?

Solutions Collecting From Web of "以编程方式确定Ubuntu的分布和架构?"

除了uname -a ,还有几种方式可以获取当前分配的信息。

  1. 最好的方法是解析发布文件。 它们通常以-release_release并位于/etc 。 以下命令将找到他们全部。

     ls /etc/*{-,_}release 
    • Ubuntu使用lsb_release
    • Redhat / Fedora使用redhat-release
    • Slackware使用slackware-release
    • Gentoo使用gentoo-release

Debian的相应文件是/etc/debian_version 。 不过,这个文件也会(有点误导性,但是有一个很好的理由)出现在Ubuntu系统上。

  1. 另一个文件是用于机器识别的/etc/issue ,用来确定当前的分发信息。

  2. 系统信息也可以在/proc/version找到。

     cat /proc/version 

一种方法是扫描uname的输出-a以检查正确的内核版本和体系结构。

但是人们通常不想分析这些工具的输出,因为它不够高雅(这被认为是黑客,所以可以这么说)。

但是,您可以使用uname()函数/ syscall:

 #include <sys/utsname.h> struct utsname sysinfo; if (uname(&sysinfo) < 0) { printf("Cannot determine OS\n"); exit(-1); } printf("Operating system name: %s\n", sysinfo.sysname); 

您可以使用一个库作为中立的操作系统。 一个解决方案是LSB和你的问题变得接近使用ISB问题 。

Afaik大多数Linux发行版也使用/etc/issue 。 其中的文本可以被管理员更改为显示不同的登录消息。

来自Fedora的示例:

 Fedora release 17 (Beefy Miracle) coreel \r on an \m (\l) 

来自Ubuntu的示例:

 Ubuntu 11.04 \n \l