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 기능(구조) sh
을 bash
사용하고 있습니다 . 따라서 실행하거나 실행 가능한 경우 에만 실행해야 합니다 .[[
sh
bash 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 시스템에서 이것이 누락될 이유가 없습니다 . 그래서 아마도 당신은 .OS
REDHAT
/etc/os-release
if
if ... elif
마지막으로 일부 명령( awk
및 grep | 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"