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
[[
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"