¿Cómo comprobamos la versión del sistema operativo y el número de parches de seguridad que se aplicarán en el servidor Linux?

¿Cómo comprobamos la versión del sistema operativo y el número de parches de seguridad que se aplicarán en el servidor Linux?

He escrito un script bash que verifica la versión del sistema operativo y cuenta los parches de seguridad disponibles según la distribución del sistema operativo.

La consulta aquí es que el script no funciona para el sistema operativo Ubuntu. El guión es el siguiente:

#!/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

Operación en la máquina Ubuntu:

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

En el sistema Ubuntu anterior, el script no funciona como se esperaba, quiero decir, debería imprimir la versión del sistema operativo y el recuento de parches de seguridad.

Respuesta1

Tienes dos problemas principales. En primer lugar, está ejecutando el script con sh, bashpero no está utilizando características de bash (la [[construcción) que no son compatibles con sh. Entonces necesitas ejecutarlo bash getos.sho simplemente ./getos.shsi es ejecutable.

A continuación, no puedes dividir los comandos donde quieras, debes hacerlo en unoperador de control. Entonces esto fallará:

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

Si bien esto funcionaría:

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

Luego, algunas cuestiones menores. Tu primero if ... elif .. elsesignifica que si /etc/os-releaseexiste, nunca harás el resto. Por lo tanto, nunca puede haber una situación en la que ambos OSy REDHATestén configurados. Sin embargo, parece que usted espera ambas cosas y no veo ninguna razón por la cual /etc/os-releasefaltarían en un sistema Red Hat. Así que creo que probablemente quieras separarlo ifen lugar de if ... elif.

Finalmente, algunos de tus comandos (el awky el grep | wc) se pueden simplificar, estás creando variables que en realidad no son necesarias y todo se puede simplificar un poco con:

#!/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"

información relacionada