リモートシステムにログインしているとしましょう。どのように実行されているかを知るにはどうすればよいですか。最近のLinux(Linuces?)のほとんどには、lsb_release
コマンドがあります。
$ lsb_release -ic
Distributor ID: LinuxMint
Codename: debian
私の知る限り、これは/etc/lsb-release
と同じ情報を提供するだけです。そのファイルが存在しない場合はどうなりますか? lsb_release
コマンドが比較的新しいことを思い出したようですが、古いシステムのOSを取得する必要がある場合はどうなりますか?
いずれにせよ、lsb
はLinux Standard Base
の略なので、Linux以外のUnicesでは機能しないと想定しています。私の知る限り、uname
からこの情報を取得する方法はないので、lsb_release
を使用しないシステムでこれを取得するにはどうすればよいですか?
lsb_release -a
は、この情報を見つけ出し、一貫した方法でそれを行うことができる最善のオプションになるでしょう。
そのコマンドのlsb
は、プロジェクトの略です Linux Standards BaseLinux Foundation が主催する包括的なプロジェクトであり、基本的な種類の一般的な方法を提供しますさまざまなLinuxディストリビューションにあるもの。
プロジェクトは自主的であり、ベンダーはユーザーとしてプロジェクトに参加できます。また、さまざまなLinuxディストリビューション内での標準化を推進するさまざまなモジュールに関するさまざまな仕様のファシリテーターとしても参加できます。
charterからの抜粋
LSBワークグループは、これらの2つの懸念に対処することを中心的な目標として持っています。主要なディストリビューションベンダーと協議して、ディストリビューションがサポートする必要のあるAPIの最小セットを説明する標準を公開しています。また、標準のサポートを測定し、アプリケーション開発者が共通セットを対象とすることを可能にするテストとツールも提供します。最後に、テスト作業を通じて、ディストリビューション間の不要な相違を防ぐよう努めています。
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つのアプローチです。
さらに検索すると、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の最新バージョンです!
私が採用しているのを見た別の方法は、上記の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 --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.
どちらを使用すればよいですか?私が頻繁に使用するLinuxディストリビューション(RedHat、Debian、Ubuntuなど)の場合は、lsb_release -a
を使用する傾向があります。 lsb_release
を提供していないシステムをサポートしている状況では、上記のスクリプトの1つと同様に、提供しているソフトウェアの配布の一部として自分でロールバックします。
以下のコメントで@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
リモートサーバーに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シェルスクリプトに移植するのは(少し退屈ですが)かなり簡単です。
python
がインストールされている場合(Python 3でもPython 2)でもかまいません)、ディストリビューション名を確認できます- ホイールを再発明することなく:
python -c "import platform;print(platform.linux_distribution()[0])"
/etc/issue
にはリリース情報を含める必要があります。私はそれをSolarisシステムで見たのはかなり確かだ。これが最新のDebianシステムのファイルです。
$ cat /etc/issue
Debian GNU/Linux 7 \n \l
$
/ etc/issueは [〜#〜] fhs [〜#〜] (Linuxシステム専用ではない)でも言及されていますが、「オプション」です。
すべてのディストリビューションで単一のコマンドからディストリビューション名を確実に取得することはできません。/etc/*-releaseから利用できるものもあれば、「lsb-release」コマンドから利用できるものもあります。
このシェルコマンドを使用して、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名を出力します。
それは働いた
[〜#〜] snmp [〜#〜] は、さまざまな種類のGNU/LinuxディストリビューションやUNIXシステムで見られるように、広く普及しているプロトコルです。
_system.sysDescr.0
_SNMPv2-MIB のオブジェクトは、ターゲットシステムでSNMPデーモンが実行されている場合、接続しているOSを見つけるのに役立ちます。
説明
エンティティのテキストによる説明。この値には、システムのハードウェアタイプ、ソフトウェアオペレーティングシステム、およびネットワークソフトウェアのフルネームとバージョンIDを含める必要があります。
ステータス:現在
アクセス:読み取り専用
snmpget(1)
マンページでは、この値を取得する方法を例を挙げて説明しています。
これを行う一般的な方法はないため、snmp exec-commandを介してrelease-stringを定義しました。
このコマンドのタスクは、ディストリビューションと、OSの現在のメジャー/マイナーバージョンを出力することです。
RHとクローンで/ etc/redhat-releaseを解析し、SuSe SuSe-releaseで...
/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のバージョン自体を決定するためのインターフェイスとしての使用がありますが、ディストリビューションやバージョンをチェックするためではありません。
私がこのスレッドから収集したものから、以下を使用しているすべてのシステムの近くから情報を取得できるはずです。
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
状況がそれを必要とした場合、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を持っているかどうかです。