在Ruby中检测Linux发行版/平台

7

1
或许有用:http://www.cyberciti.biz/faq/find-linux-distribution-name-version-number/ - Patrick Oscity
3个回答

3

如评论部分所指出的那样,似乎没有一种确定的“适用于所有发行版”的方法来完成此操作。接下来是我用来检测脚本运行环境的方式:

def linux_variant
  r = { :distro => nil, :family => nil }

  if File.exists?('/etc/lsb-release')
    File.open('/etc/lsb-release', 'r').read.each_line do |line|
      r = { :distro => $1 } if line =~ /^DISTRIB_ID=(.*)/
    end
  end

  if File.exists?('/etc/debian_version')
    r[:distro] = 'Debian' if r[:distro].nil?
    r[:family] = 'Debian' if r[:variant].nil?
  elsif File.exists?('/etc/redhat-release') or File.exists?('/etc/centos-release')
    r[:family] = 'RedHat' if r[:family].nil?
    r[:distro] = 'CentOS' if File.exists?('/etc/centos-release')
  elsif File.exists?('/etc/SuSE-release')
    r[:distro] = 'SLES' if r[:distro].nil?
  end

  return r
end

这并不是处理地球上所有GNU/Linux发行版的完整解决方案。实际上,相距甚远。例如,它没有区分OpenSUSE和SUSE Linux Enterprise Server,尽管它们是两个非常不同的系统。此外,即使只有几个发行版,也很混乱。但它可能是可以构建的东西。
您可以从源代码中找到更完整的发行版检测示例,该示例用于向配置管理系统Puppet提供事实,其中包括Facter

1
我很感谢你的回答,但这看起来很糟糕,在所有环境中都不能正常工作,比如在亚马逊实例中,你需要查看/etc/system-release。无论如何,谢谢。 - Arturo Herrero

1
一种Linux发行版是由软件集合组成的,通常可以通过它们的软件包管理器、窗口系统、窗口管理器和桌面环境来区分。这是许多可互换的部分。如果一个系统保留软件包管理器,但更改了窗口系统和桌面环境,我们是否称其为新的发行版?没有明确的答案,因此各种工具会给出略有不同的答案。 Train拥有一个完整的分支结构,可能是其中最复杂的一个。 Train和Ohai的快速比较在这里。它被设计为在网络连接上运行,但在本地也可以正常工作,如此处所示:
# gem install train
Train.create('local').connection.os[:name] #=> eg. "centos", "linuxmint"
Train.create('local').connection.os[:family] #=> eg. "redhat", "debian"

Facter操作系统家族事实返回值,例如Ubuntu为“Debian”。使用Facter检索事实的一般形式为Facter [factname] . value

# gem install facter
require 'facter'
puts Facter['osfamily'].value

Ohaiplatform fact 返回,例如 "Ubuntu 的“debian” 和 CentOS 的“rhel”。使用 Ohai,检索 facts 的一般形式是 node[factname]

# gem install ohai
node['platform'] #=> eg. "ubuntu" or "mint"
node['platform_family'] #=> eg. "debian" for Ubuntu and Mint

不区分平台的Ruby系统信息库

Platform 可以检索一些基本数据,并且可以很好地区分各种Unix平台。但是,它完全无法处理不同的Linux发行版。 Platform::IMPL 将返回:freebsd、netbsd、hpux等,但所有Linux发行版都只是:linux。 sys-unamesysinfo 类似。 utilinfo 更基础一些,将在除Windows、Mac和Linux之外的任何系统上失败。


-1
require 'facter'

puts Facter['osfamily'].value

1
不鼓励仅提供代码的答案。请添加一些解释,说明如何解决问题,或者与现有答案的区别。来自审核 - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接