在 Linux 中应用 Diff 补丁文件的 7 个补丁命令示例
特定软件有可用的安全修复程序时,我们通常使用 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 选项时,已经应用的补丁被反转了。
- 点赞
- 收藏
- 关注作者
评论(0)