在 Linux 中应用 Diff 补丁文件的 7 个补丁命令示例

举报
Tiamo_T 发表于 2022/09/15 23:45:39 2022/09/15
【摘要】 特定软件有可用的安全修复程序时,我们通常使用 yum 或 apt-get 等包管理工具进行二进制升级。 但是,可能存在您通过从源代码编译软件来安装软件的情况。

特定软件有可用的安全修复程序时,我们通常使用 yum 或 apt-get 等包管理工具进行二进制升级。

但是,可能存在您通过从源代码编译软件来安装软件的情况。

在这种情况下,您如何将安全修复程序应用于软件?

答案是下载安全补丁并将其应用于原始源代码并重新编译软件。

本教程解释了如何使用 diff 创建补丁文件,并使用 patch 命令应用它。

补丁文件是一个文本文件,其中包含同一文件(或同一源树)的两个版本之间的差异。补丁文件是使用diff 命令创建的。

1. 使用 diff 创建补丁文件

为了理解这一点,让我们创建一个名为 hello.c 的小 C 程序


#include <stdio.h> 

int main() { 
printf("Hello World\n"); 
}

现在,将 hello.c 复制到 hello_new.c

$ cp hello.c hello_new.c

如下所示编辑 hello_new.c 以进行一些小的更改:

#include <stdio.h>

int main(int argc, char *argv[]) {
printf("Hello World\n");
return 0;
}

最后,使用 diff 命令创建补丁文件,如下所示:

$ diff -u hello.c hello_new.c > hello.patch

上面的命令将创建一个名为“hello.patch”的补丁文件。

--- hello.c	2014-10-07 18:17:49.000000000 +0530
+++ hello_new.c	2014-10-07 18:17:54.000000000 +0530
@@ -1,5 +1,6 @@
 #include <stdio.h>
 
-int main() {
+int main(int argc, char *argv[]) {
 	printf("Hello World\n");
+	return 0;
 }

2.使用补丁命令应用补丁文件

“patch”命令将补丁文件作为输入,并将差异应用于一个或多个原始文件,生成补丁版本。

patch -p[num] < patchfile
patch [options] originalfile patchfile 

使用如下所示的 patch 命令将 hello.patch 应用于原始 hello.c 源代码。

$ patch < hello.patch
patching file hello.c

hello.patch 文件包含要修补的文件的名称。一旦文件被修补, hello.c 和 hello_new.c 都会有内容。

3. 从源代码树创建补丁

上面的例子非常简单,它只适用于一个文件。我们将以“openvpn”源代码为例,了解如何为完整的源代码树创建和应用补丁。

我已经下载了 2 个版本的 openvpn,openvpn-2.3.2 和 openvpn-2.3.4。

tar -xvzf openvpn-2.3.2.tar.gz 

tar -xvzf openvpn-2.3.4.tar.gz

现在我们将使用以下命令创建补丁。

diff -Naur /usr/src/openvpn-2.3.2 /usr/src/openvpn-2.3.4 > openvpn.patch

上述命令将递归操作并找出差异,并将这些差异放入补丁文件中。

4. 将补丁文件应用到源代码树

以下补丁命令可用于将补丁应用于源代码树。

# patch -p3 < /root/openvpn.patch
patching file openvpn-2.3.2/aclocal.m4
patching file openvpn-2.3.2/build/Makefile.in
patching file openvpn-2.3.2/build/msvc/Makefile.in

请注意,我们正在从 /usr/src/ 执行命令。补丁文件包含绝对路径格式的所有文件名(来自 root )。因此,当我们从 /usr/src 执行时,如果没有“-p”选项,它将无法正常工作。

-p3 告诉补丁命令跳过补丁文件中存在的文件名中的 3 个前导斜杠。在我们的例子中,补丁文件中的文件名是“/usr/src/openvpn-2.3.2/aclocal.m4”,因为你已经给出了“-p3”,3个前导斜杠,即直到/usr/src/被忽略。

5. 使用 -b 应用补丁前进行备份

您可以在应用补丁命令之前使用 -b 选项备份原始文件,如下所示。

$ patch -b < hello.patch
patching file hello.c

现在你将有一个文件名“hello.c.orig”,它是原始 hello.c 的备份。

您还可以使用 -V 来决定备份文件名格式,如下所示。现在您将拥有一个文件名“hello.c.~1~”。

$ patch -b -V numbered < hello.patch
patching file hello.c

6. 验证补丁而不应用(试运行补丁文件)

您可以干运行补丁命令以查看是否有任何错误,而无需使用 –dry-run 选项修补文件,如下所示。

$ patch --dry-run < hello.patch
patching file hello.c

可以看到 hello.c 根本没有被修改。

7. 撤消已应用的补丁(撤消补丁)

您可以使用 -R 选项来反转已经应用的补丁。

$ patch < hello.patch
patching file hello.c

$ ls -l hello.c
-rw-r--r-- 1 lakshmanan users  94 2014-10-07 20:05 hello.c

$ patch -R < hello.patch
patching file hello.c

$ ls -l hello.c
-rw-r--r-- 1 lakshmanan users  62 2014-10-07 20:04 hello.c

您可以从文件大小中注意到,当我们使用 -R 选项时,已经应用的补丁被反转了。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。