Linux 서버의 운영 체제 버전과 보안 패치 수를 확인하는 방법은 무엇입니까?

Linux 서버의 운영 체제 버전과 보안 패치 수를 확인하는 방법은 무엇입니까?

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

여기서 쿼리는 스크립트가 Ubuntu 운영 체제에서 작동하지 않는다는 것입니다. 스크립트는 다음과 같습니다.

#!/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 함수(construct)를 사용하는 sh대신 실행 스크립트를 사용하고 있습니다 . 따라서 실행하거나 실행 가능한 경우 에만 실행해야 합니다 .bash[[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"

관련 정보