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

dhxwm5r4  于 9个月前  发布在  Ruby
关注(0)|答案(3)|浏览(121)

我可以通过几种方式检查运行我的Ruby代码的平台的操作系统:

有可能知道运行的是什么Linux发行版吗?例如基于Debian的发行版或基于Red Hat的发行版。

eni9jsuy

eni9jsuy1#

正如上面的评论部分所指出的,似乎没有确定的“在每个发行版中都有效”的方法来做到这一点。下面是我用来检测脚本正在运行的环境类型的方法:

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,尽管它们是两个完全不同的野兽。此外,即使只有几个发行版,它也是一个相当意大利面条。但它可能是一个可以构建的东西。
您可以从Factersource code中找到一个更完整的分布检测示例,该示例用于向配置管理系统Puppet提供事实。

ej83mcc0

ej83mcc02#

一个Linux发行版是一个软件的集合,通常通过它们的包管理器、窗口系统、窗口管理器和桌面环境来区分。这是很多可互换的部分。如果一个系统保留了包管理器,但改变了窗口系统和桌面环境,我们会称之为新的发行版吗?没有明确的答案,所以各种工具会给出给予略有不同的答案。

**Train**有一个whole hierarchy发行版系列,可能是最复杂的一个。这里是Train和Ohai的快速比较。它被设计为通过网络连接运行,但在本地也工作得很好,如下所示:

# gem install train
Train.create('local').connection.os[:name] #=> eg. "centos", "linuxmint"
Train.create('local').connection.os[:family] #=> eg. "redhat", "debian"

字符串

**Facter**的osfamily fact返回,例如Ubuntu的“Debian”。使用Facter,检索事实的一般形式是Facter[factname].value

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

**Ohai**的platform_family事实返回,例如Ubuntu的“debian”和CentOS的“rhel”。使用Ohai,检索事实的一般形式是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以外的任何系统上都将失败。

xeufq47z

xeufq47z3#

require 'facter'

puts Facter['osfamily'].value

字符串

相关问题