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

标签 shell rpm static-analysis rpmbuild shellcheck

我要跑ShellCheck在将在部署 RPM 的地方运行的规范文件中嵌入的脚本上。我有 .spec 片段,例如,

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

除了 Hook ,
%post
#!/bin/sh
echo "Hello"

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

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

最佳答案

我最近也一直在考虑为我的一些 RPM 执行此操作。

你可以得到%prep , '%build', %install ,等等。来自规范文件本身的python部分。

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 中)获取 pre/post/etc 的内容。虽然通过 python 编写脚本。

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

关于shell - 从 RPM 规范文件中提取 shell 脚本以进行静态分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29756018/

相关文章:

bash - 如何通过调用它的 shell 脚本找到进程名称?

linux - 如何在CentOS中安装 "libhyperic-sigar-java"

c# - 是否有涵盖变量作用域的代码指标

shell - 在 fish shell 中如何检查变量是否为数字?

bash - 用于格式化文件名中数字的 Shell 命令

linux - shell脚本用空格连接两个字符串

linux - 应用程序调用 rpm 更新自身问题

centos - 已安装 Salt Stack : Function: pkg.。 yum 不更新已安装的包

jenkins - Coverity & Jenkins : Howto analyse newly committed code ONLY

python - 内存文件/流上的 pylint