我编写了一个 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
ubuntu机器中的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
在上面的 ubuntu 系统中,脚本没有按预期工作,我的意思是它应该打印操作系统版本和安全补丁的数量。
你有两个主要问题。首先,您正在使用 运行脚本
sh
,而不是使用 .bash不支持的bash
bash 功能(构造) 。所以你需要运行或者只是它是可执行的。[[
sh
bash getos.sh
./getos.sh
接下来,您不能随意中断命令,您需要在控制运算符上中断。所以这将失败:
虽然这会起作用:
然后,几个小问题。你的第一个
if ... elif .. else
意味着如果/etc/os-release
存在,你永远不会做剩下的。因此,您永远不会遇到同时设置OS
和的情况REDHAT
。但是,您似乎期待两者,而且我认为没有理由/etc/os-release
会从 Red Hat 系统中丢失。所以我认为你可能想要分开if
而不是if ... elif
.最后,您的一些命令(the
awk
和 thegrep | wc
)可以简化,您正在创建实际上不需要的变量,并且可以通过以下方式使整个事情变得更简单: