操作系统级可执行文件是否有结构化格式的版本信息?

操作系统级可执行文件是否有结构化格式的版本信息?

我正在寻找操作系统级可执行文件的版本信息的结构化格式,例如 in/usr/bin/usr/local/bin.我们遇到的问题是我们的 PROD 和 TEST 环境之间的体系结构不一致,我们发现较低环境中的许多可执行文件都应用了补丁,而 PROD 没有应用补丁,这使得很多测试无效 - 东西在 TEST 中可以工作,但不能。由于此类系统差异,t 在 PROD 中。

因此,我想运行系统保证检查来列出所有可执行文件并获取版本号,但不获取其他内容,然后生成增量。有些命令不支持该-version选项,但即使是那些显示非常详细的自由文本格式版本叙述的命令,版本号也隐藏在其中的某个位置,无法以编程方式提取它。

或者,我正在考虑为每个可执行文件运行文件级别cksum作为最后的选择,但我希望有一种方法可以以编程方式提取版本信息相关字段。

谢谢

答案1

我倾向于说没有简单的方法可以做到这一点。我这样说是因为版本控制根本不是 UNIX/Linux 中的标准化过程,或者至少在程序级别上不是任何供应商的标准化过程。

建议检查已安装的软件包信息,其中包含版本控制信息。

但是,如果人们安装的产品不使用您的发行版的标准包管理器,那么您也会得到错误的信息。

为了绝对确定,您可能必须在系统之间进行某种类型的测试校验和。

答案2

由于您已经收到 @mdpc 的答复,我将仅针对您最初的问题提供意见。我不会走这条路,因为这会带来一堆蠕虫,并且您的程序通常应该在所有系统上运行(如果您在不同的本地运行,还要检查您的系统是否仍然有效)。您也不应该真正依赖输出/命令本身,而应该使用适当的 API 来访问/修改信息。

无论如何,这里有一些方法可以帮助缓解您的问题:

  1. 使用配置管理并指定计算机上必须安装哪些程序/库。您通常还可以指定版本号。使用配置管理的另一个好处是,您通常可以获得有关系统的所有信息,即正在运行哪个内核、系统中有多少个 NIC 等。
  2. 根据您使用的编程语言,您可能需要研究虚拟化环境,即 ruby​​ 的捆绑器或 python 的 virtualenv。
  3. 使用 chroots 根据您的特定需求设置环境或(甚至更好)
  4. 只需将您的环境作为虚拟机映像提供

答案3

软件包就是答案(如果您来自 SunOS,您应该知道这一点)。

在 CentOS 上,您应该使用 RPM——仅此而已。

强制您的开发人员以 rpm 形式交付所有内容 - 然后您将在 RPM 数据库中拥有该结构化信息(甚至可以使用标准 SNMP 工具进行查询)。

答案4

就 Solaris 10 而言,属于操作系统的文件以及第三方以 SVR4 软件包形式提供的文件已经过版本控制/校验和识别。例如:

 # pkgchk -l -p /usr/bin/ls
Pathname: /usr/bin/ls
Type: regular file
Expected mode: 0555
Expected owner: root
Expected group: bin
Expected file size (bytes): 18700
Expected sum(1) of contents: 1763
Expected last modification: Mar 25 00:04:57 2010
Referenced by the following packages:
        SUNWcsu
Current status: installed

大部分信息都在/var/sadm/install/contents文件中。未使用标准工具安装的文件(即作为 tarball 或压缩存档提供的文件)对于包数据库来说是未知的,因此必须以不同的方式进行处理。校验和比较看起来是检测差异的好方法,因为无论如何都没有标准。

相关内容