确定Linux发行版


11

我试图确定正在运行哪种linux服务器。我不是要确定内核版本,而是给发行者打分。

gcc已安装,并且在版本输出中显示为RedHat

# gcc --version
gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-11)

这是否意味着我可以安全地假定我的服务器是RedHat服务器。有没有更好的方法-100%防弹方法可以找到答案?也适用于其他Linux版本-不仅是此服务器?

编辑:/etc/如果有帮助的话,它的内容-但我也想要一个适用于其他Linux版本的解决方案。

# ls /etc/
./              backupmxhosts  domainusers     host.conf     localdomains  mailips        pam.d/      relayhosts               shadow              trustedmailhosts
../             bashrc*        exim.conf       inputrc       localtime     man.config     passwd      resolv.conf              skipsmtpcheckhosts  userdomains
DIR_COLORS      cron.deny      exim.pl         ld.so.cache   lynx.cfg      mtab           profile     secondarymx              spammeripblocks     vimrc
aliases         demodomains    exim.pl.local*  ld.so.conf    mail/         my.cnf         profile.d/  senderverifybypasshosts  sudoers
antivirus.exim  demouids       group           localaliases  mailhelo      nsswitch.conf  protocols   services                 termcap

我没有*release*version文件/etc/

# ls /etc*release; ls /etc/*version
/bin/ls: /etc/*release: No such file or directory
/bin/ls: /etc/*version: No such file or directory

我试过LSB

# lsb_release -a
LSB Version:
Distributor ID: n/a
Description:    (none)
Release:        n/a
Codename:       n/a

另外-我猜我在chroot jail(不太确定那是什么)内部,很可能是造成此问题的原因。


更新:

我认为这对我有用。我想我可以确定我正在使用cent-os。

# cat /proc/version
Linux version 2.6.9-103.plus.c4smp (mockbuild@builder10.centos.org) (gcc version 3.4.6 20060404 (Red Hat 3.4.6-11)) #1 SMP Wed Dec 21 16:17:23 EST 2011

你为什么要知道?也许相反,测试通用的特定于发行版的工具(例如,程序包管理器)会做您想要的吗?
Daniel Pryden 2011年

1
好吧,我真正想知道的是是否可以在本地将服务器复制为虚拟机,然后在本地虚拟机上安装内容,然后将二进制文件复制到远程计算机上。我认为找到正确的平台将是一个很好的起点。
比利·穆恩

2
上面的目录列表不完整(例如,缺少主机,init.d,rc *)。这是测试吗?

您如何访问此服务器?您是否可能无权直接访问服务器的文件系统,而是进入chroot监狱?
丹尼尔·普赖登2011年

我想我可能会在chroot监狱中-这是否意味着我找不到底层系统?
比利·穆恩

Answers:


4
cat /proc/version

例子:

  1. Ubuntu:

    $ cat /proc/version
    Linux version 3.11.0-13-generic (buildd@roseapple) (gcc version 4.8.1 \
    (Ubuntu/Linaro 4.8.1-10ubuntu8) ) #20-Ubuntu SMP Wed Oct 23 07:38:26 UTC 2013
    
  2. 红帽/ CentOS:

    $ cat /proc/version
    Linux version 2.6.32-220.13.1.el6.x86_64 (mockbuild@c6b6.bsys.dev.centos.org) \
    (gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) ) #1 SMP Tue Apr 17 23:56:34 BST 2012
    

另请参阅如何知道您使用的是哪个Linux发行版?


这显示了内核在哪里编译,而不是您在哪个发行版上运行。在许多情况下,内核是在相同发行版上但在较旧的版本上编译的。
pabouk

13

在大多数现代Linux发行版中,以下命令将为您提供其信息:

lsb_release -a

1
不,这不是真的。这仅适用于Debian及其衍生产品
MariusMatutiae

1
在Red Hat及其衍生版本(即CentOS)上默认未安装此命令。您必须在使用前明确安装它:yum install redhat-lsb-core
pabouk

@MariusMatutiae实际上比它广泛得多,但默认情况下并不总是安装。
terdon

@terdon谢谢,我不知道。
MariusMatutiae

@MariusMatutiae 在此处查看更多信息,SuSe似乎不存在,但应将其安装在RH上。
terdon 2013年

9

/etc/issue 可能是一个很好的起点。

通过检查信息文件中的不同发行版,可以找到更多信息:

Novell SuSE    /etc/SuSE-release
OpenSuSE       /etc/SuSE-release, /etc/os-release
Red Hat,CentOS /etc/redhat-release, /etc/redhat_version
Fedora         /etc/fedora-release, /etc/redhat-release, /etc/os-release
Slackware      /etc/slackware-release, /etc/slackware-version
Debian         /etc/debian_release, /etc/debian_version
Mandrake       /etc/mandrake-release
Yellow dog     /etc/yellowdog-release
Sun JDS        /etc/sun-release 
Solaris/Sparc  /etc/release 
Gentoo         /etc/gentoo-release
Amazon Linux   /etc/system-release
PLD Linux      /etc/pld-release, /etc/os-release
ArchLinux      /etc/arch-release, /etc/os-release

有关更多详细信息,请参见Unix论坛


1
不幸的是,我没有任何文件结尾releaseversion位于我的etc目录中
Billy Moon

4

如果/etc/issue丢失,则可能有一个或多个/etc/*_release文件。

例如,我的Ubuntu系统具有/etc/lsb-release

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=11.04
DISTRIB_CODENAME=natty
DISTRIB_DESCRIPTION="Ubuntu 11.04"

朋友的CentOS系统(基于Red Hat)具有/etc/redhat-release

CentOS release 5.6 (Final)

我不知道这有多普遍。


没有releaseversion在我的文件/etc/
比利月亮

@BillyMoon我相信直到最近Linux发行版才开始在其发行版上添加lsb_release实用程序。lsb_release -a
Alpha01 2011年

谢谢你的提示-不帮我这一次不幸
比利月球

2

cat / etc / issue可能会回答您的问题。

发行商在这里对您不友好。首先,每个人都认为这是唯一的真实方法。

最有可能的是,您应该更加仔细地研究您实际需要回答的特定问题,而不是试图嗅探发行版。关注您正在查看的功能,而不是提供它的发行版。毕竟,新版本的发行版可以在任何特定轴上旋转并朝相反的方向前进。


3
/etc/issue我的服务器上没有任何内容
Billy Moon

是。请注意,其中/etc/issue可能包含转义序列,例如\n\l。以了解这些含义,man 5 issue以及man getty(该/etc/issue文件主要供)使用getty。当然,系统所有者可以/etc/issue出于某些邪恶的原因进行编辑。
基思·汤普森

我认为/etc/issue不需要存在或包含有关发行供应商的任何信息。通常可以,但是我认为您不能依靠它。
Daniel Pryden 2011年

@DanielPryden很好,每天都在学习一些东西。我从来没有遇到自己一个人缺席的情况。
bmargulies 2011年

1

使用facter(是的,它的拼写方式)。

Facter是puppet的伴侣,它提供了可以查询的变量,其中包含有关系统的信息。

例如,以下是因子可以返回的数十个变量中的几个

$ facter
...
operatingsystem => CentOS
operatingsystemmajrelease => 6
operatingsystemrelease => 6.4
osfamily => RedHat
...

您只需查询osfamily事实即可看到服务器正在运行RedHat

$ facter osfamily
RedHat

查阅文档:http : //puppetlabs.com/facter


0

uname -a

始终适用于任何Tux


1
该报告报告了内核版本字符串,如果您的主机从其他发行版运行内核(在裸机上或由于诸如OpenVZ或VServers之类的工具),则可能会非常错误。
sarnold

是的,但是我想在这种情况下,Q的作者会知道。关于情况。“外来”内核的情况很奇怪
Lazy Badger

0

没有单一的可靠方法可以做到这一点。我在unix.se上问了类似的问题,获得此信息的最佳方法是检查各种来源的脚本:

#!/bin/sh
# Detects which OS and if it is Linux then it will detect which Linux
# Distribution.

OS=`uname -s`
REV=`uname -r`
MACH=`uname -m`

GetVersionFromFile()
{
    VERSION=`cat $1 | tr "\n" ' ' | sed s/.*VERSION.*=\ // `
}

if [ "${OS}" = "SunOS" ] ; then
    OS=Solaris
    ARCH=`uname -p` 
    OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
elif [ "${OS}" = "AIX" ] ; then
    OSSTR="${OS} `oslevel` (`oslevel -r`)"
elif [ "${OS}" = "Linux" ] ; then
    KERNEL=`uname -r`
    if [ -f /etc/redhat-release ] ; then
        DIST='RedHat'
        PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
        REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
    elif [ -f /etc/SuSE-release ] ; then
        DIST=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
        REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
    elif [ -f /etc/mandrake-release ] ; then
        DIST='Mandrake'
        PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
        REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
    elif [ -f /etc/debian_version ] ; then
        DIST="Debian `cat /etc/debian_version`"
        REV=""

    fi
    if [ -f /etc/UnitedLinux-release ] ; then
        DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
    fi

    OSSTR="${OS} ${DIST} ${REV}(${PSUEDONAME} ${KERNEL} ${MACH})"

fi

echo ${OSSTR}

另一个选择的确是使用gcc --version,因为gcc总是针对特定发行版进行编译,因此这将是相对可移植的。我强烈建议您在U&L 阅读有关我的问题的公认答案,它很好地说明了情况。


0

此命令适用于基于Debian和基于Redhat的发行版:使用tr过滤器,将文档转换为每行一个单词的格式,然后计算包含发行版名称的第一行。

tr -s ' \011' '\012' < /etc/issue | head -n 1

-1

托斯是最好的方法

cat /etc/*release

/etc在问题中列出了我的目录。如其他答案所述,此解决方案对我不起作用。
Billy Moon

你试过ls / etc * release; 。这是错误的。尝试ls / etc / * release。可以肯定的.am可以正常工作
Unnikrishnan

我也在/etc/目录中执行过ls,您可以看到那里没有文件结尾release
Billy Moon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.