Linux 서버에 적용될 OS 버전과 보안패치 개수는 어떻게 확인하나요?

Linux 서버에 적용될 OS 버전과 보안패치 개수는 어떻게 확인하나요?

OS 버전을 확인하고 OS 배포에 따라 사용 가능한 보안 패치를 계산하는 bash 스크립트를 작성했습니다.

여기서 쿼리는 스크립트가 Ubuntu OS에서 작동하지 않는다는 것입니다. 스크립트는 아래와 같습니다:

#!/bin/bash


# Detecting OS Distribution
if [ -f /etc/os-release ]; then
  . /etc/os-release
  OS=$PRETTY_NAME

elif [ -f /etc/redhat-release ]; then

   REDHAT=$(cat /etc/redhat-release)

else
   echo " OS is not supported "
fi

#Check how many packages for security and available to update
if [[ $OS == *"Red Hat"* ]] || [[ $OS == *"Amazon Linux"* ]] || [[ $OS == 
    *"CentOS"*  ]] || [[ $REDHAT == *"Red Hat"*  ]] ; then

    SECPKGCNT=$(sudo yum list-security --security | awk 'NR>2 {print last} 
{last=$0}' | wc -l)
    echo "${OS},${REDHAT},${SECPKGCNT}"

elif [[ $OS == *"Ubuntu"* ]] ;then

    SECPKGCOUNT=$(sudo apt list --upgradable 2>/dev/null | grep "\-security" 
    | wc -l)
    echo "${OS},${SECPKGCOUNT}"
   else
  echo " No security packages to update"
   fi

우분투 머신의 O/P:

root@ip-XXXX:~# sh -x getos.sh
+ [ -f /etc/os-release ]
+ . /etc/os-release
+ NAME=Ubuntu
+ VERSION=14.04.5 LTS, Trusty Tahr
+ ID=ubuntu
+ ID_LIKE=debian
+ PRETTY_NAME=Ubuntu 14.04.5 LTS
+ VERSION_ID=14.04
+ HOME_URL=http://www.ubuntu.com/
+ SUPPORT_URL=http://help.ubuntu.com/
+ BUG_REPORT_URL=http://bugs.launchpad.net/ubuntu/
+ OS=Ubuntu 14.04.5 LTS
+ [[ Ubuntu 14.04.5 LTS = *Red Hat* ]]
getos.sh: 29: getos.sh: [[: not found
+ [[ Ubuntu 14.04.5 LTS = *Amazon Linux* ]]
getos.sh: 29: getos.sh: [[: not found
+ [[ Ubuntu 14.04.5 LTS = *CentOS* ]]
getos.sh: 29: getos.sh: [[: not found
+ [[ = *Red Hat* ]]
getos.sh: 29: getos.sh: [[: not found
+ [ Ubuntu 14.04.5 LTS = *Ubuntu* ]
getos.sh: 34: [: Ubuntu: unexpected operator
+ echo  No security packages to update
No security packages to update

위의 우분투 시스템에서는 스크립트가 예상대로 작동하지 않습니다. 즉, OS 버전과 보안 패치 개수를 인쇄해야 한다는 의미입니다.

답변1

두 가지 주요 문제가 있습니다. 첫째, 를 사용하여 스크립트를 실행하고 있지만 에서 지원하지 않는 bash 기능(구조) shbash사용하고 있습니다 . 따라서 실행하거나 실행 가능한 경우 에만 실행해야 합니다 .[[shbash getos.sh./getos.sh

다음으로, 원하는 곳 어디에서나 명령을 중단할 수 없습니다.제어 연산자. 그래서 이것은 실패할 것입니다:

SECPKGCOUNT=$(sudo apt list --upgradable 2>/dev/null | grep "\-security" 
| wc -l)

이것이 작동하는 동안:

SECPKGCOUNT=$(sudo apt list --upgradable 2>/dev/null | grep "\-security" | 
wc -l)

그런 다음 몇 가지 사소한 문제가 있습니다. 첫 번째는 존재한다면 나머지는 절대 수행하지 않을 것임을 if ... elif .. else의미합니다 . 따라서 및 가 모두 설정된 /etc/os-release상황은 절대 있을 수 없습니다 . 그러나 여러분은 두 가지 모두를 기대하는 것 같으며 Red Hat 시스템에서 이것이 누락될 이유가 없습니다 . 그래서 아마도 당신은 .OSREDHAT/etc/os-releaseifif ... elif

마지막으로 일부 명령( awkgrep | wc)을 단순화할 수 있습니다. 실제로 필요하지 않은 변수를 생성하고 다음을 사용하면 모든 것이 좀 더 단순해질 수 있습니다.

#!/bin/bash

if [ -f /etc/os-release ]; then
  . /etc/os-release
fi
if [ -f /etc/redhat-release ]; then
  REDHAT=$(cat /etc/redhat-release)
fi

if [[ $PRETTY_NAME == *"Red Hat"* ]] || [[ $PRETTY_NAME == *"Amazon Linux"* ]] ||
   [[ $PRETTY_NAME ==  *"CentPRETTY_NAME"* ]] || [[ $REDHAT == *"Red Hat"*  ]]; then
  SECPKGCNT=$(sudo yum list-security --security | awk 'NR>2 {k++}END{print k}')
  PRETTY_NAME="$PRETTY_NAME,$REDHAT";
elif [[ "$PRETTY_NAME" == *"Ubuntu"* ]] ;then
  SECPKGCNT=$(sudo apt list --upgradable 2>/dev/null | grep -c "\-security")
else
  echo " OS is not supported "
  exit
fi

echo "$PRETTY_NAME,$SECPKGCNT"

관련 정보