/usr/bin
などのオペレーティングシステムレベルの実行可能ファイルのバージョン情報の構造化形式を探しています/usr/local/bin
。私たちが経験している問題は、PRODとTEST環境間のアーキテクチャの不一致であり、サブ環境で多くの実行可能ファイルがすべてパッチされていますが、PRODはそうではありません。これにより、多くのテストが無効になります。 TESTでは動作しますが、動作しません。これらの体系的な違いにより、tはPRODにあります。
そのため、システム保証チェックを実行してすべての実行可能ファイルを一覧表示し、バージョン番号のみを調べてデルタを生成しようとしています。一部のコマンドはこのオプションをサポートしていません-version
が、非常に詳細なフリーテキストバージョンの説明を表示するコマンドであっても、バージョン番号はその中に隠されており、プログラムで抽出する方法はありません。
あるいは、最後の手段として、各実行ファイルに対してファイルレベルを実行することを検討していますが、cksum
バージョン情報関連フィールドをプログラムで抽出する方法を望んでいます。
ありがとう
答え1
私はこれを行う簡単な方法がないと言いたいです。私がそう言うのは、バージョン管理がUNIX / Linuxではまったく標準化されていないプロセスであるか、少なくともどのベンダーのプログラムレベルでも行われないからです。
バージョン管理情報を含むインストール済みパッケージ情報を確認することをお勧めします。
ただし、人々がディストリビューションの標準パッケージマネージャを使用していない製品をインストールしてもエラーが発生します。
確実に確認するには、システム間で一種のテストチェックサムを実行する必要があります。
答え2
@mdpcからすでに回答を受けていますので、元の質問に対するコメントだけを提供します。私はこの方法を使用しません。これはワームの可能性があり、あなたのプログラムは通常、すべてのシステムで実行する必要があるためです(他のローカルで実行している場合は、システムがまだ機能していることを確認してください)。また、出力/コマンド自体に依存してはならず、適切なAPIを使用して情報にアクセス/変更する必要があります。
とにかく問題を軽減するのに役立ついくつかの方法は次のとおりです。
- 構成管理を使用し、コンピューターにインストールする必要があるプログラム/ライブラリーを指定します。通常、バージョン番号を指定することもできます。構成管理を使用するもう1つの利点は、通常、システムに関するすべての情報(実行中のコア、システム内のNICの数など)を取得できることです。
- 使用しているプログラミング言語に応じて、仮想化環境(RubyのバンドラまたはPythonのvirtualenvなど)を確認することをお勧めします。
- chrootを使用して特定の要件に応じて環境を設定する(より良い場合)
- あなたの環境を仮想マシンイメージとして提供するだけです。
答え3
パッケージが答えです(SunOSから来た場合はこれを知る必要があります)。
CentOSではRPMを使用する必要があります。それ以上ではありません。
開発者がすべてをrpmとして提供するように強制すると、RPMデータベースに構造化された情報が含まれます(標準のSNMPツールを使用して照会することもできます)。
答え4
Solaris 10の場合、オペレーティングシステムに属するファイルとサードパーティがSVR4パッケージで提供するファイルのバージョンは指定/チェックサムされます。たとえば、
# pkgchk -l -p /usr/bin/ls
Pathname: /usr/bin/ls
Type: regular file
Expected mode: 0555
Expected owner: root
Expected group: bin
Expected file size (bytes): 18700
Expected sum(1) of contents: 1763
Expected last modification: Mar 25 00:04:57 2010
Referenced by the following packages:
SUNWcsu
Current status: installed
ほとんどの情報は/var/sadm/install/contents
ファイルにあります。標準ツールを使用してインストールされていないファイル(つまり、tarballまたは圧縮アーカイブとして提供されるファイル)は、パッケージデータベースには不明であり、異なる処理が必要です。とにかく標準がないので、チェックサム比較は違いを検出する良い方法のようです。