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

Dou*_*oug 5 scripting solaris awk

我正在尝试验证所有包,除了我知道由于已知原因会失败的预定义包列表。该脚本将在我们环境中的所有 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" }'
Run Code Online (Sandbox Code Playgroud)

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

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

Kus*_*nda 2

在 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) }'
Run Code Online (Sandbox Code Playgroud)

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

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

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

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