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おそらくこの問題の原因である可能性があります(それが何であるかは本当にわかりません)。


更新しました:

これは私のためにそれを行うと思います。私はセント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

なぜあなたは知る必要があるのですか?代わりに、一般的なディストリビューション固有のツール(パッケージマネージャーなど)をテストすることで、必要な処理を実行できますか?
ダニエルプライデン

1
まあ、本当に知りたいのは、サーバーを仮想マシンとしてローカルに複製し、ローカル仮想マシンにインストールしてから、バイナリをリモートマシンにコピーできるかどうかです。正しいプラットフォームを見つけることが良い出発点になると思いました。
ビリームーン

2
上記のディレクトリリストは不完全です(たとえば、hostsが見つからない、init.d、rc *)。これはテストですか?

このサーバーにどのようにアクセスしていますか?サーバーのファイルシステムに直接アクセスできず、代わりにchroot刑務所の中にいる可能性はありますか?
ダニエルプライデン

私はchroot刑務所の中にいる可能性があると思います-これは、基になるシステムが何であるかを見つけることができないことを意味しますか?
ビリームーン

回答:


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. Red Hat / 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ありがとう、私はそれを知りませんでした。
MariusMatutiae

@MariusMatutiaeの詳細はこちらをご覧ください。SuSeにはないようですが、RHにインストールする必要があります。
テルドン

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
残念ながら私は、いずれかのファイルが終了していないreleaseか、version私の中でetcディレクトリ
ビリー・ムーン

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)

これがどれほど普遍的かはわかりません。


いいえreleaseまたはversion私のファイル/etc/
ビリームーン

@BillyMoon Linuxディストリビューションがlsb_releaseユーティリティをディストリビューションに追加し始めたのはごく最近のことです。lsb_release -a
Alpha01

ヒントをありがとう-残念ながら今回は役に立たない
ビリームーン

2

cat / etc / issueが質問に答える場合があります。

ここでディストリビューションのメーカーはあなたに友好的ではありません。まず、一人一人がそれが唯一の真の方法だと考えています。

ほとんどの場合、ディストリビューションをスニッフィングしようとする代わりに、実際に答える必要がある特定の質問を詳細に調べる必要があります。提供しているディストリビューションではなく、見ている機能に注目してください。結局のところ、新しいバージョンのディストリビューションは向きを変えて、特定の軸で反対方向に進むことができます。


3
/etc/issue私のサーバーにはありません
ビリームーン

はい。や/etc/issueなどのエスケープシーケンスを含めることができます。これらの意味を確認するため、および(ファイルは主にによる使用を目的としています)。もちろん、システムの所有者はなんらかの悪質な理由で編集できます。\n\lman 5 issueman getty/etc/issuegetty/etc/issue
キーストンプソン

/etc/issue存在する必要はないと思いますし、ディストリビューションベンダーに関する情報を含める必要もありません。それは一般的に行いますが、あなたがそれに頼ることができるとは思いません。
ダニエル・プライデン

@DanielPrydenは、毎日何かを学んでいます。私は以前に自分の不在に遭遇することはありませんでした。
-bmargulies

1

使用facter(はい、それは綴り方です)。

Facterはパペットの仲間であり、システムに関する情報を含むクエリ可能な変数を提供します。

たとえば、ここでfactorが返すことができる数十の変数のほんの一部を示します

$ 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の著者はsmthを知っていると思います。状況について。「外国の」カーネルはかなり奇妙なケースです
レイジーバジャー

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フィルターを使用して、ドキュメントを1行あたり1ワードの形式に変換し、ディストリビューション名を含む最初の行をカウントします。

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

-1

Thosは最良の方法です

cat /etc/*release

/etc質問にディレクトリをリストしました。他の回答で説明したように、この解決策は私にはうまくいきません。
ビリームーン

Uはls / etc * releaseを試しました。。違います。ls / etc / * releaseを試してください。それはかなり確実に動作します
Unnikrishnan

私はまた、LSやった/etc/ディレクトリを、あなたが見ることができるという点で、そこに最後にはファイルがありませんrelease
ビリー・ムーン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.