【问题标题】:For loop to read a CVE list and compareFor 循环读取 CVE 列表并进行比较
【发布时间】:2013-08-15 16:23:01
【问题描述】:

我正在尝试遍历 CVE 列表,与 rpm -qa --changelog 进行比较,并输出 RPM 名称和 CVE grep 输出,但无法到达那里。

列表采用列格式。

我希望输出如下: RPM : CVE 输出

rpm -q $RPM --changelog|grep $CVE

$RPM 来自 rpm -qa,$CVE 来自 cat CVE.list

【问题讨论】:

  • 当 RPM 位于 rpm -qa 和 --changelog 之间时,它为什么来自 rpm -qa?还有你在 CVE.list 中的令牌是如何分开的?按行还是按空格?

标签: bash for-loop while-loop


【解决方案1】:

以下不是一个巧妙的单行,但它有效。 ——约翰·霍尔

#!/bin/ksh
#
# Show which installed RPM's contain specified CVE's.
#
echo "\
CVE-2011-3348
CVE-2012-0031
" | \
while read CVE
do
     case $CVE in
         "") break ;;
     esac
     echo; echo "Processing [$CVE] ... "
     rpm -qa | \
     while read RPM
     do
          rpm -q --changelog $RPM | grep $CVE > /dev/null
          case $? in
              0) echo "RPM: $RPM "
                 rpm -q --changelog $RPM | grep $CVE
              ;;
          esac
     done
done

【讨论】:

    【解决方案2】:

    试试类似的东西

    rpmout=$(rpm -q $RPM --changelog)
    for vuln in $(cat "$CVE")
    do
        cvegrep=$( rpm -q "$RPM" --changelog | grep "$vuln")
        echo -en "$rpmout : $cvegrep\n"
    done
    

    编辑:编辑以考虑特定的输出需求。这可能需要进一步编辑,具体取决于 CVE 文件格式的确切内容以及 rpm 命令的输出内容。

    【讨论】:

    • $(cat "$CVE") 可以简化为 $(
    • 不幸的是,这并没有为我提供干净的 RPM 名称输出,然后是修补 CVE 的更改日志的输出。
    • 编辑了初始 RPM 查询,以便从 RPM 中获取更改日志,rpm -q $RPM --changelog。然后使用 |grep $CVE 找到您遵循的特定 CVE 我希望有如下输出: openssh : Fixed CVE-1234-5678
    • 所以该行需要类似于 rpm -q $RPM --changelog && rpm -q $RPM --changelog | grep "$CVE"
    • 或者更好的是,将每个变量分配给它们自己的变量: rpmout=$(rpm -q $RPM --changelog) cvegrep=$( rpm -q $RPM --changelog | grep "$CVE" ) echo -en "$rpmout : $cvegrep\n"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多