リモートシステムにログインしたと仮定すると、それが実行されていることをどのように知ることができますか?ほとんどの最新のLinux(Linux?)には、次のコマンドがありますlsb_release
。
$ lsb_release -ic
Distributor ID: LinuxMint
Codename: debian
私が知る限り、それと同じ情報を提供します/etc/lsb-release
。ファイルが存在しない場合はどうなりますか?コマンドが比較的新しいものであることを覚えているようですがlsb_release
、以前のシステム用のOSを入手する必要がある場合はどうすればよいですか?
とにかく、LinuxではなくUnicesでは動作しないと仮定しますlsb
。Linux 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 --version
gccが実行されているシステムと常に同じディストリビューションが得られます。
フェドラ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" コマンドで使用できます。