実行しているLinuxのバージョンを確認するにはどうすればよいですか?


29

スクリプトは、Linuxごとに異なる動作をする必要がある場合があります。スクリプトが実行されているLinuxのバージョンを確認するにはどうすればよいですか?


1
バージョンとは、カーネルのバージョンのことですか?どのような分布ですか?ディストリビューション版?
クリスアップチャーチ

2
jlduggerは、システムがどのディストリビューションファミリを実行しているのかを知りたいと確信しています。/ sysや/ procなどに依存しない限り、スクリプトがカーネルバージョンの影響を受けることはまずありません。その場合でも、通常はカーネルよりもディストリビューションに基づいて推測する方が簡単です。
ミハイリンバザン2009年

回答:


27

できることとできないことについて、ディストリビューションに基づいて仮定しようとしないでください。その方法は狂気にあります(「ユーザーエージェントの検出」も参照)。代わりに、やりたいことがサポートされているかどうか、使用したいコマンドやファイルの場所によってそれがどのように行われているかを検出します。

たとえば、パッケージをインストールする場合、dpkgまたはrpmの存在を確認することにより、DebianライクシステムまたはRedHatライクシステムのどちらであるかを検出できます(Debianマシンはそれらのrpmコマンド...)。DebianシステムであるかRedHatシステムであるかだけでなく、それに基づいて何をすべきかを決定してください。そうすれば、明示的にプログラムしなかった派生ディストリビューションを自動的にサポートします。ああ、パッケージに特定の依存関係が必要な場合は、それらもテストして、ユーザーに不足しているものを知らせます。

別の例は、ネットワークインターフェイスをいじる場合です。/ etc / network / interfacesファイルまたは/ etc / sysconfig / network-scriptsディレクトリがあるかどうかに基づいて何をすべきかを判断し、そこから進みます。

はい、それはより多くの作業ですが、Web開発者が過去10年以上に犯したすべての間違いを作り直したいのでなければ、最初からスマートな方法でそれを行います。


1
(この答えを拡張する)状況によっては特徴検出が望ましい場合もありますが、検出した特徴から分布を推測しようとしないでください!答えを読み間違えず、/ etcにあるファイルに基づいてプラットフォームがRedHatであるかどうかを判断してください。本当にディストリビューション名が必要な場合は、lsb_release(または/ etc / redhat-releaseなど)を確認してください。
ニコラスウィルソン

36

クロスディストリビューションの方法はありません。しかしながら:

  • Redhat and friends:テスト/etc/redhat-release、コンテンツの確認
  • Debian:のテスト/etc/debian_version、内容の確認
  • マンドリバと友人:テスト/etc/version、内容の確認
  • Slackware:テスト/etc/slackware-version、コンテンツの確認

など一般的に言えばチェック/etc/*-releaseして/etc/*-version


編集:私の周りにある古い(1年以上の)bashスクリプトを発見しました。これは長年にわたって一緒に石畳になったに違いありません(6年前に遡る印象的なCVSログがあります)。テスト対象のインストール済みディストリビューションを見つけるのに煩わされることはありませんが、良い出発点を提供するはずです。CentOS、Fedora、Gentooで正常に動作します。gyaresuはDebian Lennyで正常にテストしました。

#!/bin/bash

get_distribution_type()
{
    local dtype
    # Assume unknown
    dtype="unknown"

    # First test against Fedora / RHEL / CentOS / generic Redhat derivative
    if [ -r /etc/rc.d/init.d/functions ]; then
        source /etc/rc.d/init.d/functions
        [ zz`type -t passed 2>/dev/null` == "zzfunction" ] && dtype="redhat"

    # Then test against SUSE (must be after Redhat,
    # I've seen rc.status on Ubuntu I think? TODO: Recheck that)
    elif [ -r /etc/rc.status ]; then
        source /etc/rc.status
        [ zz`type -t rc_reset 2>/dev/null` == "zzfunction" ] && dtype="suse"

    # Then test against Debian, Ubuntu and friends
    elif [ -r /lib/lsb/init-functions ]; then
        source /lib/lsb/init-functions
        [ zz`type -t log_begin_msg 2>/dev/null` == "zzfunction" ] && dtype="debian"

    # Then test against Gentoo
    elif [ -r /etc/init.d/functions.sh ]; then
        source /etc/init.d/functions.sh
        [ zz`type -t ebegin 2>/dev/null` == "zzfunction" ] && dtype="gentoo"

    # For Slackware we currently just test if /etc/slackware-version exists
    # and isn't empty (TODO: Find a better way :)
    elif [ -s /etc/slackware-version ]; then
        dtype="slackware"
    fi
    echo $dtype
}

これはおそらくBashでのみ正しく機能することに注意してください。他のシェル用に書き換えることができます。

そうは言っても、ディストリビューションではなく機能をテストすることをお勧めします。メンテナンスの負担になったからといって、私はもうこれを使用していません。クロスディストリビューションのツールとソリューションに依存する方が簡単です。


概念的には、次の順序で実行されます:

  • 既知の「共通の初期化スクリプト関数」タイプのファイルを取り込みます。それらはディストリビューション固有です。存在しない場合は、次の配布チェックにスキップします。
  • そのコアスクリプトから、特定の、既存の、よく使用され、名前が変更される可能性の低い特定の存在を確認します。typeBashビルトインを使用してこれを行います。そのシンボルが関数である場合にtype -t返しますfunction。名前が定義されていない場合、出力文字列が空になり、演算子に左手がないという構文エラーが発生するためzz、出力の先頭に追加しtype -t 2>/dev/nullます==。チェックした名前が関数ではない場合は、次の配信チェックにスキップします。それ以外の場合は、配信タイプが見つかりました。
  • 最後に、関数出力がcase .. esacブロックで簡単に使用できるように、分布タイプをエコーし​​ます。

これを単純なスクリプトとして実行しようとしている場合に編集します。このスクリプトは、他のスクリプトからソースを取得するか、含まれるようになっています。そのまま実行した場合、それ自体は何も出力しません。テストするには、ソースを指定してから関数を呼び出します。例:

source /path/to/this/script.sh
get_distribution_type

bashプロンプトで。


編集:このスクリプトはルート権限を必要としないことに注意してください。rootとして実行しないことをお勧めします。何も害はないはずですが、必要はありません。


CVSログに関連するメーリングリストの投稿へのリンクが見つかりました。initスクリプトスパゲッティの展開に役立つはずです。


なぜ見てもいませんが、Debian Lenny(5.0)でプロンプトに戻ります。
ガレス

gyaresu、実際にget_distribution_type関数を呼び出しましたか?私は明確にするためにポストを編集した(一番下を参照。)
ミハイLimbăşan

@gyaresu:上記が問題ではなかった場合、Debianセクションのlog_begin_msgをlog_warning_msgに置き換えて再試行してください。関数名が間違っている可能性があります。いずれにせよ、その関数がそれ以外の場合は「不明」を返しているはずですが、それでもまだです。
ミハイリンバシャン2009年

@Mihai Doh!ごめんなさい。スクリプトを正しく読みませんでした。早かった、コーヒーなし。おpoび申し上げます。gyaresu @ debian:〜/ bin $ source server_version.sh gyaresu @ debian:〜/ bin $ get_distribution_type debian
ガレス

@gyaresu:ありがとう!それは良いことです。jlduggerがDebianでも動作することを知るのに役立つはずです:)
MihaiLimbăşan2009年

17

を実行するとuname -a、カーネルのバージョンを見つけることができます。ディストリビューションのバージョンはディストリビューションに依存しています。

Ubuntuおよびその他のOSでは、lsb_release -a/ etc / lsb_releaseを実行または読み取ることができます

Debianはバージョンを/ etc / debian_versionに保存します


lsb_releaseの+1(正しいパッケージがインストールされている場合はRed Hat派生製品でも動作します)
ジョシュケリー

「lsb_release -ds」という説明のみ。
フリッカーフライ14

6

ほとんどのディストリビューションには、特定の分布を決定する独自の方法があります。

例えば:

Redhat (And derivatives): /etc/redhat-release

SUSE: /etc/SUSE-release

Linux Standard BaseまたはLSBとして知られる標準があります。Linuxディストリビューションに関する情報をエコーバックする/ etc / lsb-releaseと呼ばれるファイルまたはlsb_releaseと呼ばれるプログラムがあることを定義しています。

lsb_release -a

そしてもちろん、lsb_releaseCentOS 6には存在しません。-
ジャスティン


5

他の回答に加えて:1つのファイルを解析するだけの場合、ほとんどのディストリビューションは/ etc / issueを介してttyログインをパーソナライズします。例:

SUSE Linux Enterprise Server 10 SP2(i586)へようこそ-カーネル\ r(\ l)。

そして、はい、私はそれが準最適であることを知っています。:)


最適ではないかもしれませんが、同じ場所にあります。
ブラッドギルバート

4

facterはこの種の発見に便利なツールですが、おそらく上記の方法のいくつかを使用し、Rubyが必要です。


2

必要uname -aなのは、お気に入りのシェルで入力するだけです。これにより、カーネル名とバージョンが出力されます。


2

私は、cat /etc/*release*ほとんど常に動作することを発見しました。


2

私はマーク、アダム、ミハイに同意します(評判が不十分なため、投票できません)。LSBとその関連FHSに基づくソリューションは、ほとんどのディストリビューションで機能し、今後も機能し続ける可能性があります。LSBとFHSはあなたの友達です。


2

また、バージョンを取得することもできます

cat /proc/version

o / p:

Linuxバージョン2.6.17-13mdv(rtp@octopus.mandriva.com)(gccバージョン4.1.2 20070302(プレリリース)(4.1​​.2-1mdv2007.1))#1 SMP Fri Mar 23 19:03:31 UTC 2007


1

Linuxのバージョンは難しい質問です。よく見ると、「uname -r」で取得できるカーネルバージョンがあります。配布バージョンはほとんど無関係です。一部のディストリビューションの方が優れています(Redhat Enterprise Linuxなどのエンタープライズディストリビューション)。Gentooのような他のディストリビューションは、基本的には賢明なバージョンをまったく持たない移動ターゲットです。バージョンに基づいて物事を行う必要がある場合は、あなたに関連する主要なコンポーネントを見てください。

Component       Version command
glibc           /lib/libc.so.6
gcc             gcc --version
X               xdpyinfo
libX11          pkg-config --modversion x11
gtk+            pkg-config --modversion gtk+-2.0
qt-4            pkg-config --modversion QtCore

   etc...


-1

FusionInventoryは、多くのLinuxディストリビューションだけでなく、BSD、Windows、MacOS X、その他のユニックスでもこの情報を取得できるクロスプラットフォームの軽量インベントリツールです。

使用可能な場合はlsb_release(上記で何度か述べたように)使用しますが、そうでない場合は、ディストリビューションの名前とバージョンを確認するための非常に便利なファイルと正規表現のリストがあります:https : //github.com/fusinv/fusioninventory-agent/ blob / 2.2.x / lib / FusionInventory / Agent / Task / Inventory / Input / Linux / Distro / NonLSB.pm#L16

このロジックを使用して独自のスクリプトを再実装するのではなく、FusionInventory自体を使用してこの情報を取得することをお勧めします。コミュニティがこの機能を最新に維持しているためです。エージェントを単独で使用するか(解析しやすいXML / JSONファイルを出力する)、または必要に応じてGLPIRudderなどのネットワーク内のマシンを管理するためのより広範なソリューションと組み合わせることができます。


それはPerlモジュールの外部依存関係を持っていなかった場合、これは良い解決策になる
ウィル・シェパード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.