Solaris:PKG - 用于验证除少数软件包之外的所有软件包的脚本

Solaris:PKG - 用于验证除少数软件包之外的所有软件包的脚本

我正在尝试验证除预定义的软件包列表之外的所有软件包,我知道这些软件包将因已知原因而失败。该脚本将在我们环境中的所有 Solaris 系统上运行,以确认系统基线。

我对任何适用于此的技术持开放态度,并且可以将其放在一行上(我用于验证的工具的限制)。

我最初的想法是获取一个 pkg 列表,通过 AWK 运行它以获取包名称,过滤掉我不需要的包,然后对剩余的每个包单独运行单独的 pkg 验证。

这是我在下面创建的代码:

pkg list | awk 'BEGIN {c=0} $1 == "exclude1" || $1 == "exclude2" { next } { system("pkg verify " $1); c++ } END { if (c == 0) print "none" }'

我遇到的问题是我没有看到任何输出,即使我知道应该有一些东西无法通过 pkg 验证。

我认为系统(会捕获输出,但我对 AWK 比较陌生,可能是我误解了某些内容。

答案1

在 Solaris 11.3 上,您将希望使用nawk而不是awk. nawk("new awk") 默认安装,并且应该位于您的路径 ( /usr/bin/nawk) 中。

system()(任何实现)中的函数不awk返回命令的输出,而是返回其退出代码。不过这没关系,因为你可能不想要实际的输出pkg。如果出现问题,该pkg命令将以非零退出代码退出(请参阅手册pkg)。

以下管道将获取pkg list输出并跳过第一行(这是标题)以及与排除的包名称匹配的所有行。对于其余的输入行,它将使用包名称pkg verify执行。system()

如果pkg verify返回非零退出状态,它将增加一个计数器。处理结束时,将显示计数器,显示发生了多少次验证错误。

pkg list | nawk 'NR > 1 && !/exclude1|exclude2/ { if (system("pkg verify " $1)) { e++ } } END { printf("%d errors\n", e) }'

但这是相当低效的。一次性获取软件包列表并验证它们会更快:

pkg list | nawk 'NR > 1 && !/exclude1|exclude2/ { print $1 }' | ( xargs pkg verify ) || echo "there were errors"

如果文件中有要忽略的包列表:

pkg list | /usr/xpg4/bin/grep -F -v -f excluded.txt | nawk 'NR > 1 { print }' | ( xargs pkg verify ) || echo "there were errors"

答案2

更改您的脚本以使用 gawk 而不是 awk。

简单测试:

# pkg list|awk '{system("pkg verify $1")}'
# 

# pkg list|gawk '{system("pkg verify $1")}'
PACKAGE                                                                 STATUS
pkg://solaris/driver/storage/ssd                                         ERROR

相关内容