从RPM规范文件中提取shell脚本以进行静态分析

时间:2015-04-20 18:49:16

标签: shell rpm static-analysis rpmbuild shellcheck

我想在嵌入在spec文件中的脚本上运行ShellCheck,该文件将在部署RPM的地方运行。我有.spec片段之类的,

%setup -q
cat > ./example.sh << EOF
#!/bin/sh
echo "example"
EOF

以及钩子,

%post
#!/bin/sh
echo "Hello"

有没有办法以编程方式提取这些shell片段来运行像ShellCheck这样的脚本分析工具?像是rpmbuild --save-temps或者像这样的概念?或者每个脚本都需要被已知文本绑定,以便我可以使用流工具(grepawksed等)?

我有大量的spec文件,我不想修改。例如,检查安全相关项的脚本等,而无需解析spec文件。搜索bison + spec给出了错误的概念,我认为你需要解析RPM宏和许多其他机制;或者语法比我想的简单?

1 个答案:

答案 0 :(得分:1)

我最近也考虑过为我的一些RPM做这个。

您可以使用spec文件本身的python获取%prep,&#39;%build&#39;,%install等部分。

CentOS 5代码:

import rpm

ts = rpm.ts()

spec = ts.parseSpec("package.spec")

for section in ['build', 'clean', 'install', 'prep']:
    try:
        print '%s' % (getattr(s, section,)())
    except:
        pass

CentOS 6代码:

import rpm

spec = rpm.spec('package.spec')

for section in ['build', 'clean', 'install', 'prep']:
    if hasattr(spec, section):
        print '%s' % (getattr(spec, section),)

似乎没有办法(在CentOS 5或6中)获取前/后/等的内容。虽然通过python编写了scriptlet。

因此,您可能需要使用rpm -qp --scripts将它们从构建的RPM中取出,然后将该输出拆分为临时文件并对其运行shellcheck。