0

Avamar クライアントを Redhat または Centos ボックスにインストールできるシェル スクリプトを作成しようとしています。インストールしたいパッケージをリポジトリディレクトリ /ava/repo に配置します

スクリプトは次のことを実行する必要があります。

  1. /ava/repo で最新のパッケージを確認してください。この場合、最新は AvamarClient-linux-sles11-x86_64-6.1.100-802.rpm (編集済み) になります。

  2. 以前にインストールされた Avamar クライアントのサーバーを確認します。私はチェックを行うことができます

    rpm -qa | grep AvamarClient

AvamarClient-6.1.100-402.x86_64

  1. バージョンを確認したら、インストールしているバージョンと比較する必要があります。たとえば、追加する pkg (/ava/repo にある最新のもの) が AvamarClient-6.1.200-102.x86_64 の場合、これを AvamarClient-6.1.100-402.x86_6 と照合して、どちらが新しいかを判断する必要があります。同じ。

インストールしようとしている pkg が同じ場合、pkg が既にインストールされていることをログ ファイルに出力して終了する

インストールしようとしている pkg が古い場合、既にインストールされている pkg の方がログファイルに出力され、終了します。

インストールしようとしているパッケージが新しい場合は、古いパッケージをアンインストールしてから新しいパッケージをインストールし、パッケージがアップグレードされたことをログファイルに出力してから終了します

私は基本的なシェルスキルしか持っていないので、この作業は私にとって難しいことがわかりました! どんな助けでも大歓迎です。ありがとう

4

2 に答える 2

2

これは、テキストの抽出と操作をかなり詳細に行う方法を示しています。基本的に、/ava/repo 内の候補ファイルからバージョンを抽出し、次の式を使用して比較に使用できる番号に変換します。

AVAMAR_INSTALLED_MAGIC=$((1000000 * $AVAMAR_INSTALLED_VER_MAJ + 10000 * $AVAMAR_INSTALLED_VER_MIN + $AVAMAR_INSTALLED_VER_REL))

この数値形式を使用して、最初に /ava/repo にある最新バージョンを把握し、それをインストールしたバージョンと比較して、それを置き換えるかどうかを確認します。

だからここに行きます:

これは複雑です

まず全体:

AVAMAR_CANDIDATE=$(ls -1 /ava/repo/AvamarClient* |   \ 
           sed -e 's/.*/&:&/'                                       \
               -e 's/-[0-9]*-x86_64//1'                             \
               -e 's/AvamarClient-//'                               \
               -e 's/\./:/1' -e 's/\./:/1' |                        \
           awk -F: '{ print 1000000 * $1 + 10000 * $2 + $3 " " $4 }' | \
           sort -n | tail -n1 )

それでは、何が起こっているのか見てみましょう。リポジトリに候補のコピーが複数あると仮定します。

のすべてのファイルを一覧表示し、/ava/repoそれを sed + awk スクリプトにパイプします。このスクリプトは、バージョン番号を把握し、最後のファイルが最新のものになるように並べ替えます。

各パーツを見ていきましょう

SED

ステップ1:

       -e 's/.*/&:&/'

で区切られた名前の 2 つのコピーを作成します:。(最初のものを切り離し、ステップ 2 と 3 を使用してバージョン番号だけに減らします。後で rpm コマンドを使用するために 2 番目のものはそのままにしておきます)

ステップ2:

      -e 's/-[0-9]*-x86_64[^:]*//1'

正確には、ファイル名の最初のコピーから単語を削除します。以前に挿入した (コロンは除く)-NNN-x86_64.rpmまでの末尾のビットを削除します。:

ステップ 3:

     -e 's/AvamarClient-//' 

AvamarClient-ファイル名の最初のコピーから単語を取り除く

ステップ 4:

     -e 's/\./:/1' -e 's/\./:/1'

抽出.されたバージョン番号のみを:

たとえば、次のようになります。

     ls -1 /ava/repo/AvamarClient-6.4.200-400-x86_64.rpm  | sed -e 's/.*/&:&/' -e 's/-[0-9]*-x86_64[^:]*//1' -e 's/AvamarClient-//' -e 's/\./:/1' -e 's/\./:/1'

出力します:

     6:4:200:AvamarClient-6.4.200-400-x86_64.rpm

AWK

抽出されたバージョンを魔法のようなものに変換するために、 awk: を介してそれをプッシュします。ここで-F:は、区切り文字として : を使用して上記の文字列を分割します。つまり、$1 = MAJ、$2 = MIN、$3 = REL、$4 = ファイル名です。たとえば、上記では $1 = 6; となります。$2 = 4; $3 = 200; $4 = AvamarClient-6.4.200-400-x86_64.rpm

そこで、魔法の公式を適用して、ファイル名を awk に出力します。

    '{ print 1000000 * $1 + 10000 * $2 + $3 " " $4 }' 

したがって、上記の例では、次のように出力されます。

    6040200 AvamarClient-6.4.200-400-x86_64

そしてほら、魔法の匹敵する数があります

ソートとテール

リポジトリには複数のファイルがある可能性があるため、上記はそれらのリストになります。マジック ナンバーがあるため、それを使用して最新のファイルを取得できます。を使用sort -nして並べ替え、tail -n1最後のものを取得するために使用します (並べ替えは昇順です)。

したがって、AVAMAR_CANDIDATE では次のようになります。6040200 AvamarClient-6.4.200-400-x86_64

生活を楽にして、これを 2 つの変数に入れましょう。

      AVAMAR_CANDIDATE_FILE=$(echo $AVAMAR_CANDIDATE | cut -f2 -d' ')
      AVAMAR_CANDIDATE_MAGIC=$(echo $AVAMAR_CANDIDATE | cut -f1 -d' ')

インストールされたバージョンで同じことをしましょう:

AVAMAR_INSTALLED=$(rpm -qa | grep AvamarClient)

AVAMAR_INSTALLED_MAGIC=$(echo $AVAMAR_INSTALLED | \
      sed -e 's/^AvamarClient-//'  \ 
          -e 's/-[0-9].*x86_64$//' \
          -e 's/\./:/g' | \
      awk -F: '{ print 1000000 * $1 + 10000 * $2  + $3 }' )

あとは、2 つのマジック ナンバーの値を比較するだけです。

if [ $AVAMAR_INSTALLED_MAGIC -lt $AVAMAR_CANDIDATE_MAGIC ] ; then
         rpm -ivU /ava/repo/$AVAMAR_CANDIDATE_FILE 
fi

シェル スクリプトは驚くほど強力なツールであるため、これを使用してシェル スクリプトを学習できるようになることを願っています。

于 2013-04-29T07:41:43.877 に答える
-2

インストールしたパッケージからメジャー番号、マイナー番号、ビルド番号を取得する必要があります。同様に、インストールしようとしているパッケージのメジャー番号、マイナー番号、およびビルド番号を知る必要があります。メジャー番号、マイナー番号、ビルド番号の順に比較することから始めます

私が説明したようにロジックを書きました

#!/bin/bash

INSTALLED_VERSION="AvamarClient-6.1.100-402.x86_64"
CURRENT_VERSION="AvamarClient-6.1.90-102.x86_64"

#get the Major numbe,Minor number and build number from the Installed version string
INST_MAJOR=`echo $INSTALLED_VERSION | cut -d'-' -f2 | cut -d'.' -f1`
INST_MINOR=`echo $INSTALLED_VERSION | cut -d'-' -f2 | cut -d'.' -f2`
INST_BUILD=`echo $INSTALLED_VERSION | cut -d'-' -f2 | cut -d'.' -f3`
echo "INST_MAJOR=$INST_MAJOR,INST_MINOR=$INST_MINOR,INST_BUILD=$INST_BUILD"

#get the Major numbe,Minor number and build number from the Current version string
CUR_MAJOR=`echo $CURRENT_VERSION | cut -d'-' -f2 | cut -d'.' -f1`
CUR_MINOR=`echo $CURRENT_VERSION | cut -d'-' -f2 | cut -d'.' -f2`
CUR_BUILD=`echo $CURRENT_VERSION | cut -d'-' -f2 | cut -d'.' -f3`
echo "CUR_MAJOR=$CUR_MAJOR,CUR_MINOR=$CUR_MINOR,CUR_BUILD=$CUR_BUILD"

if [ $CUR_MAJOR -gt $INST_MAJOR ]
then
    echo "Starting with Installation..."
elif [ $CUR_MAJOR -eq $INST_MAJOR ]
then
    if [ $CUR_MINOR -gt $INST_MINOR ]
    then
        echo "Starting with Installation..."
    elif [ $CUR_MINOR -eq $INST_MINOR ]
    then
        if [ $CUR_BUILD -gt $INST_BUILD ]
        then
            echo "Starting with Installation..."
        elif [ $CUR_BUILD -eq $INST_BUILD ]
        then
            echo "Package already installed..."
        else
            echo "You are trying to install older package...Exiting"
        fi
    else
        echo "You are trying to install older package...Exiting"
    fi
else
    echo "You are trying to install older package...Exiting"
fi
于 2013-04-29T07:25:10.510 に答える