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
, bash
pero no está utilizando características de bash (la [[
construcción) que no son compatibles con sh
. Entonces necesitas ejecutarlo bash getos.sh
o simplemente ./getos.sh
si 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 .. else
significa que si /etc/os-release
existe, nunca harás el resto. Por lo tanto, nunca puede haber una situación en la que ambos OS
y REDHAT
estén configurados. Sin embargo, parece que usted espera ambas cosas y no veo ninguna razón por la cual /etc/os-release
faltarían en un sistema Red Hat. Así que creo que probablemente quieras separarlo if
en lugar de if ... elif
.
Finalmente, algunos de tus comandos (el awk
y 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"