題 確定Linux發行版


我試圖確定正在運行的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

11
2017-10-07 21:12


起源


你為什麼需要知道?也許測試常見的特定於發行版的工具(例如包管理器)會做你想要的嗎? - Daniel Pryden
好吧,我真正想知道的是,如果我可以在本地將服務器複製為虛擬機,然後在本地虛擬機上安裝東西,然後將二進製文件複製到遠程機器上。我認為找到正確的平台將是一個很好的起點。 - Billy Moon
上面的目錄列表不完整(例如缺少主機,init.d,rc *)。這是考試嗎?
你是如何訪問這台服務器的?您是否有可能無法直接訪問服務器的文件系統,而是在chroot jail中? - Daniel Pryden
我想我可以進入chroot監獄 - 這是否意味著我無法找出底層系統是什麼? - Billy Moon


答案:


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發行版?


4
2017-11-19 18:20



這表明內核編譯的位置不是您運行的分發版。在許多情況下,內核在相同的發行版上編譯,但在舊版本上編譯。 - pabouk


在大多數現代Linux發行版中,以下命令將為您提供以下信息:

lsb_release -a

13
2017-10-07 21:46



不,這不是真的。這僅適用於Debian和衍生產品 - MariusMatutiae
默認情況下,Red Hat和衍生產品(即CentOS)不會安裝此命令。您必須在使用前明確安裝它: yum install redhat-lsb-core。 - pabouk
@MariusMatutiae實際上比它更廣泛,但默認情況下並不總是安裝。 - terdon
@terdon謝謝你,我不知道。 - MariusMatutiae
@MariusMatutiae看 這裡 有關更多信息,似乎沒有SuSe,但應安裝在RH上。 - terdon


/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論壇 更多細節。


9
2017-10-07 21:18



不幸的是我沒有任何文件結束 release 要么 version 在我的 etc 目錄 - Billy Moon


如果 /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)

我不知道這是多麼普遍。


4
2017-10-07 21:21



沒有 release 要么 version 我的文件 /etc/ - Billy Moon
@BillyMoon我相信最近Linux發行版開始在他們的發行版中添加lsb_release實用程序。 lsb_release -a - Alpha01
謝謝你的提示 - 不幸的是這次沒有幫助我 - Billy Moon


cat / etc / issue可能會回答你的問題。

發行商對你不友好。首先,每個人都認為這是唯一真正的方式。

最有可能的是,您應該更詳細地查看您實際需要回答的特定問題,而不是試圖嗅探發行版。專注於您正在考慮的功能,而不是提供它的發行版。畢竟,新版本的發行版可以轉向並在任何特定軸上向相反方向前進。


2
2017-10-07 21:13



沒有 /etc/issue 在我的服務器上 - Billy Moon
是。注意 /etc/issue 可能包含轉義序列,如 \n 和 \l。看看這些是什麼意思, man 5 issue 和 man getty (該 /etc/issue 文件主要供...使用 getty)。當然系統的所有者可以編輯 /etc/issue 出於某種邪惡的原因。 - Keith Thompson
我不認為 /etc/issue 必須存在,或包含有關分發供應商的任何信息。它通常會,但我認為你不能依賴它。 - Daniel Pryden
@DanielPryden每天都學到一些東西。我以前從未遇到過一個人的缺席。 - bmargulies


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

Facter是puppet的伴侶,它提供可以查詢的變量,其中包含有關係統的信息。

例如,這裡只是因子可以返回的幾十個變量中的一小部分

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

您可以簡單地查詢osfamily事實以查看服務器是否正在運行RedHat

$ facter osfamily
RedHat

查看文檔: http://puppetlabs.com/facter


1
2017-11-20 07:12





uname -a

適用於任何Tux


0
2017-10-09 00:43



報告說 核心 版本字符串,如果您的主機從不同的發行版運行內核,可能是非常錯誤的 - 無論是裸機還是OpenVZ或VServers等工具。 - sarnold
是的,但我猜想 這個 Q的案例作者會知道smth。關於情況。 “外來”內核相當奇怪 - Lazy Badger


沒有一個確定的火災方式這樣做。我問過類似的問題  過去 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
2017-12-19 17:12