目录

1.概述

2.使用diff对比单个文件差异

3.diff命令常用选项:

4.使用patch命令对单文件代码打补丁

5.对比目录中所有文件的差异


1.概述

程序是人设计出来的,总是会有这样那样的问题与漏洞,目前的主流解决方法就是为有问题的程序打补丁,升级新版本。

在Linux系统中diff命令可以为我们生成补丁文件,然后使用patch命令为有问题的程序代码打补丁。

2.使用diff对比单个文件差异

1) 编写两个版本的脚本,一个为v1版本,一个为v2版本。

  1. [root@proxy ~]# cat test1.sh                                //v1版本脚本
  2. hello,i am jjh
    today nice
  3. [root@proxy ~]# cat test2.sh                                //v2版本脚本
  4. hello,i am ljz
    yestday is nice

2) 使用diff命令语法

使用diff命令查看不同版本文件的差异。

  1. [root@proxy ~]# diff test1.sh test2.sh                     //查看文件差异
  2. 1,2c1,2
    < hello,i am jjh
    < today nice
    ---
    > hello,i am ljz
    > yestday is nice
  3. [root@proxy ~]# diff -u test1.sh test2.sh                 //查看差异,包含头部信息
  4. --- test1.txt    2020-02-04 11:53:25.390097646 +0800
    +++ test2.txt    2020-02-04 11:53:58.261485821 +0800
    @@ -1,2 +1,2 @@                   
    -hello,i am jjh                         #文件1想变成文件2,需要删除两条信息,'-'代表删除
    -today nice  
    +hello,i am ljz                        #'+' 代表加入列出信息
    +yestday is nice

diff制作补丁文件的原理:告诉我们怎么修改第一个文件后能得到第二个文件。

这样如果第一个版本的脚本有漏洞,我们不需要将整个脚本都替换,仅需要修改有问题的一小部分代码即可,diff刚好可以满足这个需求!

像Linux内核这样的大块头,一旦发现有一个小漏洞,我们不可能把整个内核都重新下载,全部替换一遍,而仅需要更新有问题的那一小部分代码即可!

3.diff命令常用选项:

-u 输出统一内容的头部信息(打补丁使用),计算机知道是哪个文件需要修改

-r 递归对比目录中的所有资源(可以对比目录)

-a 所有文件视为文本(包括二进制程序)

-N 无文件视为空文件(空文件怎么变成第二个文件)

-N选项备注说明:

A目录下没有txt文件,B目录下有txt文件

diff比较两个目录时,默认会提示txt仅在B目录有(无法对比差异,修复文件)

diff比较时使用N选项,则diff会拿B下的txt与A下的空文件对比,补丁信息会明确说明如何从空文件修改后变成txt文件,打补丁即可成功!

4.使用patch命令对单文件代码打补丁

1)准备实验环境

  1. [root@proxy ~]# cd demo
  2. [root@proxy demo]# vim test1.sh
  3. #!/bin/bash
  4. echo "hello world"
  5. echo "test"
  6. [root@proxy demo]# vim test2.sh
  7. #!/bin/bash
  8. echo "hello the world"
  9. echo "test file"

2) 生成补丁文件

  1. [root@proxy demo]# diff -u test1.sh test2.sh > test.patch

3)使用patch命令打补丁

在代码相同目录下为代码打补丁

  1. [root@proxy demo]# yum -y install patch
  2. [root@proxy demo]# patch -p0 < test.patch                    //打补丁
  3. patching file test1.sh
  4. //patch -pnum(其中num为数字,指定删除补丁文件中多少层路径前缀)
  5. //如原始路径为/usr/howard/src/blurfl/blurfl.c
  6. //-p0则整个路径不变,相当于当前路径

4)反向修复:卸载补丁,还原版本

  1. //-R(reverse)反向修复,-E修复后如果文件为空,则删除该文件
  2. [root@proxy demo]# patch -RE < test.patch                     //还原旧版本,反向修复

5.对比目录中所有文件的差异

1) 准备两个目录

创建两个目录,人为的制造差异

  1. [root@proxy ~]# mkdir demo           #创建父目录demo
  2. [root@proxy ~]# cd demo
  3. [root@proxy demo]# mkdir {source1,source2}       #创建子目录source1和source2
  4. [root@proxy demo]# echo "hello world" > source1/test.sh  #在source1下创建一个子文件
  5. [root@proxy demo]# ls source1/                        #source1目录下1个文件
  6. test.sh
  7. [root@proxy demo]# echo "hello the world" > source2/test.sh  #在source2下创建一个子文件
  8. [root@proxy demo]# echo "test" > source2/tmp.txt         #在source2下创建一个子文件
  9. [root@proxy demo]# tree source2/                        //source1目录下3个文件
  10. test.sh tmp.txt

2)制作补丁文件

  1. [root@proxy demo]# diff -u source1/ source2/
  2. //仅对比了文本文件test.sh;二进制文件、tmp都没有对比差异,仅提示,因为没有-a和-N选项
  3. [root@proxy demo]# diff -Nu source1/ source2/
  4. //对比了test.sh,并且使用source2目录的tmp.txt与source1的空文件对比差异。
  5. [root@proxy demo]# diff -Nua source1/ source2/
  6. //对比了test.sh、tmp.txt、find(程序)。

3)使用patch命令对目录下的所有代码打补丁

使用前面创建的source1和source2目录下的代码为素材,生成补丁文件

  1. [root@proxy ~]# cd demo
  2. [root@proxy demo]# diff -Nuar source1/ source2/ > source.patch

4)使用patch命令为代码打补丁

  1. [root@proxy demo]# ls
  2. source1 source2 source.patch
  3. [root@proxy demo]# cat source.patch                //对比的文件有路径信息
  4. --- source1/test.sh 2018-02-07 22:51:33.034879417 +0800
  5. +++ source2/test.sh 2018-02-07 22:47:32.531754268 +0800
  6. @@ -1 +1 @@
  7. -hello world
  8. +hello the world
  9. [root@proxy demo]# cd source1
  10. [root@proxy source1]# patch -p1 < ../source.patch   #由于进入到了source1目录,这里的-p需要写1,路径前缀需要追加一层

Linux使用diff对比文件差异,生成补丁,patch打补丁相关推荐

  1. linux下diff、patch制作补丁

    http://blog.csdn.net/goldfighter/article/details/6150309 学习资料的收集比较简单,方法一类似于这种初级问题网上资料非常丰富,google或者ba ...

  2. Linux的diff和git diff生成patch/打patch

    一.Linux的diff生成patch和打patch 1.单个文件生成patch #  diff -up xxx/a.txt yyy/b.txt  > mypatch_1 参数解释: -u:显示 ...

  3. 生成补丁 与 打补丁 diff patch

    有两个目录 每个目录中有一个相同名字的文件  但是内容 是些地方有差别,我们以此来做实验 验证diff patch 这两个命令 目录1:/you 包含file.c 这个文件比下面的file.c文件 多 ...

  4. diff patch制作补丁打补丁

    对于开源源码修改过程中的必经阶段:对源码打补丁,总是不够精通,搜索了补丁的原理的详细过程,如下: 在移植或版本升级过程中,手动比对(用比对工具)转换是很费力的事情,特别是发生变化的文件非常多的情况下, ...

  5. <Linux>使用quilt工具制作补丁(patch)文件

    Linux使用quilt工具制作补丁文件 前言 一.安装quilt工具 二.一个需要被打补丁的文件 三.quilt new命令创建初始补丁文件 四.quilt add命令添加目标文件 五.修改目标文件 ...

  6. Linux内核补丁降级,linux内核生成补丁和打补丁的方法

    linux内核源码较多,在修改完内核并发布新内核的时候,一般采用补丁的方式进行发布,而不是整个内核打包发布的. 采用补丁的方式发布有很多好处,1.首先体积很小,通常内核修改很小,生成补丁可能不到1k的 ...

  7. linux 生成内核patch,谢宝友: 手把手教你给Linux内核发patch

    本文简介 本文一步一步的演示如何生成一个简单Linux内核补丁,并提交给Linux社区.用以展示向社区提交补丁的步骤.本文英文名称:<Submit Patches Step by Step> ...

  8. linux git diff patch,拿到git patch要怎麼用一般patch指令merge?

    如果你的codebase工作環境沒有使用git作管理, 你要怎麼做從git產生的patch呢? 首先要先知道diff 與 patch 的關係, 傳統的linux裡面, .patch檔案是透過diff產 ...

  9. 【Linux内核分析与驱动编程】添加内核补丁

    什么是补丁 补丁就是存放着不同版本之间差异的文件.通过打补丁的方法升级源代码,可以不用下载整个源代码,在本地的源代码基础上获得代码更新. 详细的打补丁的方法可以查看内核/Document/applyi ...

最新文章

  1. 如果机器能帮我们学习,那么有多少东西能够被遗忘?
  2. 4G EPS 的接口类型
  3. Android跨进程通信一 Messenger
  4. ALV调用标准GUI STATUS
  5. vue打包成app后,背景图片不显示
  6. HDU - 2122 Ice_cream’s world III
  7. X265代码学习1-X265源码下载编译及VS调试配置
  8. 程序员小技巧-----如何提升电脑速度
  9. AutoCAD 2007打开慢
  10. 077 三角函数定积分性质
  11. 什么软件可以代替sc防火墙_车玻璃水的成份是什么?普通肥皂水和清水可以代替吗?...
  12. ERP软件触发器判断单身数据为什么状态,如何执行
  13. koa-redis + ioredis
  14. 9月有哪些程序员新书与您相约?
  15. iOS开发必备工具:SimpleMind轻量思维导图
  16. September 2007
  17. 减法公式运算法则_矩阵的运算及其运算规则
  18. IP地址的规划和设计方法(一)
  19. 3GP/MP4 视频文件格式解析及其播放原理(转)
  20. MFC对话框应用程序中谷歌CEF浏览器内核的使用

热门文章

  1. Andorid-初识
  2. 文件目录IBM的LPI复习资料之LPI101-Topic103 :GNU和Unix命令(3)文件和目录管理
  3. ascii 在线转换地址
  4. iphone系统禁止升级
  5. 四、EasyExcel实现Excel读写,封装工具类
  6. AVAudioPlayer音频播放
  7. android studio做一个计时器,android studio怎么编写计时器
  8. app中的webview是什么?如何理解?
  9. 跨域问题:Access to XMLHttpRequest at ‘http://localhost:3001/re‘ from origin ‘http://127.0.0.1:8848‘
  10. 组件-Element---Input(输入框)