web-dev-qa-db-ja.com

オペレーティングシステムの名前を確実に取得するにはどうすればよいですか?

リモートシステムにログインしているとしましょう。どのように実行されているかを知るにはどうすればよいですか。最近のLinux(Linuces?)のほとんどには、lsb_releaseコマンドがあります。

$ lsb_release -ic    
Distributor ID: LinuxMint
Codename:       debian

私の知る限り、これは/etc/lsb-releaseと同じ情報を提供するだけです。そのファイルが存在しない場合はどうなりますか? lsb_releaseコマンドが比較的新しいことを思い出したようですが、古いシステムのOSを取得する必要がある場合はどうなりますか?

いずれにせよ、lsbLinux Standard Baseの略なので、Linux以外のUnicesでは機能しないと想定しています。私の知る限り、unameからこの情報を取得する方法はないので、lsb_releaseを使用しないシステムでこれを取得するにはどうすればよいですか?

70
terdon

lsb_release -aは、この情報を見つけ出し、一貫した方法でそれを行うことができる最善のオプションになるでしょう。

LSBの歴史

そのコマンドのlsbは、プロジェクトの略です Linux Standards BaseLinux Foundation が主催する包括的なプロジェクトであり、基本的な種類の一般的な方法を提供しますさまざまなLinuxディストリビューションにあるもの。

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

charterからの抜粋

LSBワークグループは、これらの2つの懸念に対処することを中心的な目標として持っています。主要なディストリビューションベンダーと協議して、ディストリビューションがサポートする必要のあるAPIの最小セットを説明する標準を公開しています。また、標準のサポートを測定し、アプリケーション開発者が共通セットを対象とすることを可能にするテストとツールも提供します。最後に、テスト作業を通じて、ディストリビューション間の不要な相違を防ぐよう努めています。

LSBに関連する役立つリンク

批判

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

ノベル

検索すると、かなり古い日付のページに出くわす可能性があります: Detecting Underlying Linux Distro from Novell。これは、主要なディストリビューションのいくつかと、使用している基礎となるディストリビューションを検出する方法を示す実際のリストを見た数少ない場所の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

この同じページには、Vanilla unameコマンドだけを使用して上記を成文化しようとする便利なスクリプトと、上記のファイルのいずれかの存在も含まれています。

注:このリストには日付が付いていますが、Mandrakeなどの日付の付いたディストリビューションをリストから簡単に削除し、別のディストリビューションに置き換えることができます。この種類のスクリプトは、SolarisとLinuxのバリアントを大量にサポートしようとしている場合の1つのアプローチです。

Linuxマフィア

さらに検索すると、Linuxmafia.comで管理されている次のページが表示されます。タイトルは Sundry Linux(および他のUnix)ディストリビューションと同等の/ etc/release です。これはおそらく、これまでに見た中で最も包括的なリストです。このリストをケース/スイッチステートメントで体系化し、ソフトウェア配布の一部として含めることができます。

実際、そのページの下部に、まさにそれを実行するスクリプトがあります。そのため、スクリプトをダウンロードして、ソフトウェア配布のサードパーティとして使用できます。

script

#!/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の最新バージョンです!

Legroomスクリプト

私が採用しているのを見た別の方法は、上記の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を利用することです。コマンドgcc --versionをクエリすると、gccがビルドされたディストリビューションが表示されます。これは、実行中のシステムと常に同じです。

Fedora 14

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

CentOS 5.x

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

CentOS 6.x

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

Ubuntu 12.04

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

TL; DR;

どちらを使用すればよいですか?私が頻繁に使用するLinuxディストリビューション(RedHat、Debian、Ubuntuなど)の場合は、lsb_release -aを使用する傾向があります。 lsb_releaseを提供していないシステムをサポートしている状況では、上記のスクリプトの1つと同様に、提供しているソフトウェアの配布の一部として自分でロールバックします。

アップデート#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

ここにロブの応答があります

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 
74
slm

リモートサーバーにfacterをインストールできない可能性があるため、OS名を見つけるためにそれを模倣できます。 Ruby operatingsystemファクトのコードが見つかります ここではPastebinにあります 。基本的に、異なる*-releaseファイルなどを使用して、OS名を決定します。

それが見るファイルのいくつか:

/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

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

16
Joseph R.

pythonがインストールされている場合(Python 3でもPython 2)でもかまいません)、ディストリビューション名を確認できます- ホイールを再発明することなく

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

/etc/issueにはリリース情報を含める必要があります。私はそれをSolarisシステムで見たのはかなり確かだ。これが最新のDebianシステムのファイルです。

$ cat /etc/issue
Debian GNU/Linux 7 \n \l

$ 

/ etc/issueは [〜#〜] fhs [〜#〜] (Linuxシステム専用ではない)でも言及されていますが、「オプション」です。

6
user4443

すべてのディストリビューションで単一のコマンドからディストリビューション名を確実に取得することはできません。/etc/*-releaseから利用できるものもあれば、「lsb-release」コマンドから利用できるものもあります。

6
boz

このシェルコマンドを使用して、Linuxディストリビューションを示す文字列を取得しました。

for f in $(find /etc -type f -maxdepth 1 \( ! -wholename /etc/os-release ! -wholename /etc/lsb-release -wholename /etc/\*release -o -wholename /etc/\*version \) 2> /dev/null); do echo ${f:5:${#f}-13}; done;

このコマンドは、Joseph R.とslmの回答に基づいています。

/ etc/{osname} -releaseや/ etc/{osname} _versionなどのファイルを探し、特定のOS名を出力します。

それは働いた

  • CentOS(centos)
  • RedHat(redhat)
  • Debian(debian)
  • アーチ(アーチ)
  • OpenSUSE(OpenSUSE)
  • Fedora(フェドラ)
  • Ubuntu(debian)
4
scrutari

[〜#〜] snmp [〜#〜] は、さまざまな種類のGNU/LinuxディストリビューションやUNIXシステムで見られるように、広く普及しているプロトコルです。

_system.sysDescr.0_SNMPv2-MIB のオブジェクトは、ターゲットシステムでSNMPデーモンが実行されている場合、接続しているOSを見つけるのに役立ちます。

説明

エンティティのテキストによる説明。この値には、システムのハードウェアタイプ、ソフトウェアオペレーティングシステム、およびネットワークソフトウェアのフルネームとバージョンIDを含める必要があります。

ステータス:現在

アクセス:読み取り専用

snmpget(1) マンページでは、この値を取得する方法を例を挙げて説明しています。

1
dawud

これを行う一般的な方法はないため、snmp exec-commandを介してrelease-stringを定義しました。

このコマンドのタスクは、ディストリビューションと、OSの現在のメジャー/マイナーバージョンを出力することです。

RHとクローンで/ etc/redhat-releaseを解析し、S​​uSe SuSe-releaseで...

1
Nils

/etc/os-releaseを使用:

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.10 (Cosmic Cuttlefish)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.10"
VERSION_ID="18.10"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=cosmic
UBUNTU_CODENAME=cosmic

理由は、FAQリンクで詳しく説明されています http://0pointer.de/blog/projects/os-release.html 提供されています @weberjn in this comment 。2013年からの賛成投票でこれまでのところトップの回答であるlsb_releaseの使用に反対する引数を1つだけ挙げます。

これにはすでにlsb_releaseツールがあります。なぜそれを使用しないのですか?まあ、それは非常に奇妙なインターフェースです:呼び出す必要があるシェルスクリプト(したがって、Cコードから非同期で生成されます)。拡張可能に作成されていません。これは多くのディストリビューションでオプションのパッケージであり、ウェルカムメッセージを表示するために初期ブートの一部として呼び出すことはできません。 (ユーザースペースの起動時間が1秒未満の場合は、ウェルカムメッセージを表示するなどの簡単な操作のために巨大なシェルスクリプトを呼び出したくありません)。 lsb_releaseツールは、配布チェックの標準化が必要な場合に、配布チェックを抽象化する試みのようです。それは単に悪いデザインのインターフェースです。私たちの意見では、LSBのバージョン自体を決定するためのインターフェイスとしての使用がありますが、ディストリビューションやバージョンをチェックするためではありません。

1

私がこのスレッドから収集したものから、以下を使用しているすべてのシステムの近くから情報を取得できるはずです。

if which lsb_release &>> /dev/null; then
    lsb_release -a
Elif [ -r /etc/issue ]; then
    cat /etc/issue
else
    ls /etc/ | grep -e '[_-]release$' -e '[_-]version$' | xargs -I % -n 1 cat /etc/%
fi
1
Sammitch

状況がそれを必要とした場合、snmpwalk(または一般にSNMPプロトコル)を使用してリモートで調べることができます。以下に例を示します。

snmpwalk -Os -c <snmp community string> -v1 <hostname> sysDescr.0

OUPUT:sysDescr.0 = STRING:Linux example.hostname.com 2.6.32-358.23.2.el6.x86_64#1 SMP Sat Sep 14 05:32:37 EDT 2013 x86_64

信頼性の鍵は、SNMPが環境で正しく設定されているかどうか、すべてのホストが適切なコミュニティストリング設定で実行されているsnmpを持っているかどうかです。

1
xpros