オペレーティングシステムの名前を確実に取得する方法は?

オペレーティングシステムの名前を確実に取得する方法は?

リモートシステムにログインしたと仮定すると、それが実行されていることをどのように知ることができますか?ほとんどの最新のLinux(Linux?)には、次のコマンドがありますlsb_release

$ lsb_release -ic    
Distributor ID: LinuxMint
Codename:       debian

私が知る限り、それと同じ情報を提供します/etc/lsb-release。ファイルが存在しない場合はどうなりますか?コマンドが比較的新しいものであることを覚えているようですがlsb_release、以前のシステム用のOSを入手する必要がある場合はどうすればよいですか?

とにかく、LinuxではなくUnicesでは動作しないと仮定しますlsbLinux Standard Base私が知る限り、この情報を得る方法はありません。unameそれでは、使用していないシステムからこの情報をどのように取得できますかlsb_release

答え1

lsb_release -aおそらく、この情報を見つけて一貫した方法で見つけることができるのが最善の方法でしょう。

LSBの歴史

この命令のlsb代表項目Linux標準ライブラリこれはLinux財団さまざまなLinuxディストリビューションで基本的なタスクを実行するための一般的な方法を提供します。

このプロジェクトは自発的であり、ベンダーはさまざまなLinuxディストリビューション内で標準化を推進するのに役立つさまざまなモジュールのさまざまな仕様のユーザーまたはプロデューサーとしてプロジェクトに参加できます。

から抜粋チャーター

LSBワーキンググループの主な目的は、これら2つの問題を解決することです。主要ディストリビューションベンダーとの協議を通じて、ディストリビューションがサポートする必要がある最小APIセットを記述する標準を発表しました。また、標準のサポートを測定し、アプリケーション開発者が共通セットをターゲットにするためのテストとツールを提供します。最後に、テスト努力により、分布間の不必要な差異を防止しようとする。

LSB関連の有用なリンク

傷つく

LSBには、Debianなどのディストリビューションに問題を引き起こす多くの問題があります。 RPMの使用を強制することがその一つです。よりこの問題の詳細については、Wikipediaの記事を参照してください。

ノーウェル

検索すると、次のタイトルのやや古く見えるページを見つけることができます。基本的なLinuxディストリビューションの検出ノーウェルから。これは、いくつかの主要なディストリビューションと、使用しているデフォルトのディストリビューションを検索する方法を示す実際のリストがある数少ない場所の1つです。

抜粋

Novell SUSE         /etc/SUSE-release
Red Hat             /etc/redhat-release, /etc/redhat_version
Fedora              /etc/fedora-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
UnitedLinux         /etc/UnitedLinux-release
ubuntu              /etc/lsb-release

uname同じページには、通常のコマンドと上記のファイルの1つの存在のみを使用して上記の内容をエンコードしようとする便利なスクリプトも含まれています。

メモ:このリストは古いですが、リストから古いディストリビューション(Mandrakeなど)を簡単に削除して代替に置き換えることができます。多数のSolarisおよびLinuxのバリアントをサポートする場合は、このタイプのスクリプトが適している可能性があります。

Linux マフィア

さらに検索すると、Linuxmafia.comで管理されている次のタイトルのページが表示されます。 さまざまなLinux(および他のUnix)ディストリビューションに対応する/ etc / release。これはおそらく私が今まで見たものの中で最も徹底したリストです。 case/switch ステートメントを使用してこのリストを作成し、ソフトウェア配布に含めることができます。

実際、ページの下部にそのタスクを実行するスクリプトがあります。したがって、ソフトウェア配布の第三者としてスクリプトをダウンロードして使用できます。

スクリプト

#!/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}

メモ:このスクリプトはおなじみのようです。 Novellスクリプトの最新バージョンです!

脚空間スクリプト

私が見た別の方法は、上記のNovellの方法と似ていますが、LSBを使用して独自のスクリプトをローリングすることです。この記事のタイトルは次のとおりです。Linux(またはUNIX)ディストリビューションの名前を解決する一般的な方法、そのようなアプローチの1つを示しています。

# Determine OS platform
UNAME=$(uname | tr "[:upper:]" "[:lower:]")
# If Linux, try to determine specific distribution
if [ "$UNAME" == "linux" ]; then
    # If available, use LSB to identify distribution
    if [ -f /etc/lsb-release -o -d /etc/lsb-release.d ]; then
        export DISTRO=$(lsb_release -i | cut -d: -f2 | sed s/'^\t'//)
    # Otherwise, use release info file
    else
        export DISTRO=$(ls -d /etc/[A-Za-z]*[_-][rv]e[lr]* | grep -v "lsb" | cut -d'/' -f3 | cut -d'-' -f1 | cut -d'_' -f1)
    fi
fi
# For everything else (or if above failed), just use generic identifier
[ "$DISTRO" == "" ] && export DISTRO=$UNAME
unset UNAME

このコードは、システム/etc/bashrcまたは一部のファイルに含まれる次の環境変数を設定できます$DISTRO

湾岸協力協議会

信じるかどうか、または代替はを使用することですgcc。そのコマンドを照会すると、gcc --versiongccが実行されているシステムと常に同じディストリビューションが得られます。

フェドラ14

$ gcc --version
gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
Copyright (C) 2010 Free Software Foundation, Inc.

セントOS 5.x

$ gcc --version
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54)
Copyright (C) 2006 Free Software Foundation, Inc.

セントOS 6.x

$ gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
Copyright (C) 2010 Free Software Foundation, Inc.

Ubuntu12.04

$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.

TL;博士;

では、どちらを使うべきですか?私はlsb_release -a定期的に使用するLinuxディストリビューション(RedHat、Debian、Ubuntuなど)を選択する傾向があります。提供されていないシステムをサポートする場合は、上記のスクリプトのいずれかlsb_releaseと同様に、提供されたソフトウェア配布の一部として独自のシステムをリリースします。

アップデート#1:SuSEのフォローアップ

以下のコメントで@Nilsと話すと、何らかの理由でSLES11がデフォルトのインストール済みLSBを放棄することが確認されました。これはオプションのインストールに過ぎず、これらの重要な機能を提供するパッケージと矛盾しているようです。

だから私はOpenSuSEプロジェクトの人々に連絡し、その理由を理解する機会がありました。

電子メールの抜粋

Hi Rob,

I hope you don't mind me contacting you directly but I found your info here: 
https://en.opensuse.org/User:Rjschwei. I participate on one of the StackExchange 
sites, Unix & Linux and a question recently came up regarding the best option 
for determining the underlying OS.

http://unix.stackexchange.com/questions/92199/how-can-i-reliably-get-the-operating-systems-name/92218?noredirect=1#comment140840_92218

In my answer I suggested using lsb_release, but one of the other users mentioned 
that this command wasn't installed as part of SLES11 which kind of surprised me. 
Anyway we were looking for some way to confirm whether this was intentionally 
dropped from SLES or it was accidental.

Would you know how we could go about confirming this one way or another?

Thanks for reading this, appreciate any help and/or guidance on this.

-Sam Mingolelli
http://unix.stackexchange.com/users/7453/slm

Robの答えです。

Hi,

On 10/01/2013 09:31 AM, Sam Mingo wrote:
- show quoted text -

lsb_release was not dropped in SLES 11. SLES 11 is LSB certified. However, it 
is not installed by default, which is consistent with pretty much every other
distribution. The lsb_release command is part of the lsb-release package.

At present almost every distribution has an entry in /etc such as 
/etc/SuSE-release for SLES and openSUSE. Since this is difficult for ISVs and 
others there is a standardization effort going on driven by the convergence to 
systemd. The standard location for distribution information in the future will 
be /etc/os-release, although Ubuntu will probably do something different.

HTH,    
Robert

--  Robert Schweikert                           MAY THE SOURCE BE WITH YOU    
SUSE-IBM Software Integration Center                   LINUX    
Tech Lead    
Public Cloud Architect 

答え2

facterリモートサーバーにインストールできない可能性があるため、オペレーティングシステムの名前を見つけるために実行する操作を模倣することができます。operatingsystemこの事実を見つけることができるルビーコードペーストビンに。デフォルトでは、*-releaseオペレーティングシステムの名前を決定するためにさまざまなファイルやその他のファイルを調べます。

見ているファイルのいくつかは次のとおりです。

/etc/debian_version
/etc/gentoo-release
/etc/fedora-release
/etc/mandriva-release
/etc/mandrake-release
/etc/meego-release
/etc/arch-release
/etc/oracle-release
/etc/enterprise-release
/etc/ovs-release
/etc/vmware-release
/etc/redhat-release
/etc/SuSE-release
/etc/bluewhite64-version
/etc/slamd64-version
/etc/slackware-version
/etc/alpine-release
/etc/system-release
/etc/centos-release

このリストで重複したアイテムが見つかった場合は申し訳ありません。私はQuickを使って作成しましたgrep。これをPOSIXシェルスクリプトに移植するのはかなり簡単です(少し退屈ですが)。

答え3

すでにpythonインストールされている場合(Python 3またはPython 2)、展開名を見つけることができます。ホイールを再発明する必要はありません。:

python -c "import platform;print(platform.linux_distribution()[0])"

答え4

すべてのデプロイメントに対して単一のコマンドでデプロイメント名を確実に取得することはできません。一部は /etc/*-release で使用でき、他の一部は "lsb-release" コマンドで使用できます。

関連情報