GNU/Linux >> LINUX-Kenntnisse >  >> Linux

7 Patch-Befehlsbeispiele zum Anwenden von Diff-Patch-Dateien unter Linux

Wenn für eine bestimmte Software ein Sicherheitsfix verfügbar ist, führen wir normalerweise ein binäres Upgrade mit den Paketverwaltungstools wie yum oder apt-get durch.

Es kann jedoch Situationen geben, in denen Sie eine Software installiert haben, indem Sie sie aus dem Quellcode kompiliert haben.

Wie wenden Sie in dieser Situation den Sicherheitsfix auf die Software an?

Die Antwort ist, den Sicherheitspatch herunterzuladen und auf den ursprünglichen Quellcode anzuwenden und die Software neu zu kompilieren.

Dieses Tutorial erklärt, wie man eine Patch-Datei mit diff erstellt und sie mit dem Patch-Befehl anwendet.

Eine Patch-Datei ist eine Textdatei, die die Unterschiede zwischen zwei Versionen derselben Datei (oder desselben Quellbaums) enthält. Die Patch-Datei wird mit dem Befehl diff erstellt.

1. Erstellen Sie eine Patch-Datei mit diff

Um dies zu verstehen, erstellen wir ein kleines C-Programm namens hello.c

#include <stdio.h> 

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

Kopieren Sie nun hello.c nach hello_new.c

$ cp hello.c hello_new.c

Bearbeiten Sie hello_new.c wie unten gezeigt, um einige kleine Änderungen vorzunehmen:

#include <stdio.h>

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

Erstellen Sie schließlich die Patch-Datei mit dem diff-Befehl wie unten gezeigt:

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

Der obige Befehl erstellt eine Patch-Datei mit dem Namen „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. Wenden Sie die Patch-Datei mit dem Patch-Befehl an

Der „patch“-Befehl nimmt eine Patch-Datei als Eingabe und wendet die Unterschiede auf eine oder mehrere Originaldatei(en) an, wodurch gepatchte Versionen erstellt werden.

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

Wenden Sie den Patch-Befehl wie unten gezeigt an, um hello.patch auf den ursprünglichen hello.c-Quellcode anzuwenden.

$ patch < hello.patch
patching file hello.c

Die Datei hello.patch enthält den Namen der zu patchenden Datei. Sobald die Datei gepatcht ist, haben sowohl hello.c als auch hello_new.c den Inhalt.

3. Erstellen Sie einen Patch aus einem Quellbaum

Das obige Beispiel war so einfach, dass es nur mit einer Datei funktioniert. Wir werden sehen, wie man Patches für einen vollständigen Quellbaum erstellt und anwendet, indem wir den „openvpn“-Quellcode als Beispiel nehmen.

Ich habe 2 Versionen von openvpn heruntergeladen, openvpn-2.3.2 und openvpn-2.3.4.

tar -xvzf openvpn-2.3.2.tar.gz

tar -xvzf openvpn-2.3.4.tar.gz

Jetzt erstellen wir den Patch mit dem folgenden Befehl.

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

Der obige Befehl arbeitet rekursiv und findet die Unterschiede und platziert diese Unterschiede in der Patch-Datei.

4. Anwenden einer Patch-Datei auf einen Quellcodebaum

Die folgenden Patch-Befehle können verwendet werden, um den Patch auf den Quellbaum anzuwenden.

# 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
...

Bitte beachten Sie, dass wir den Befehl von /usr/src/ ausführen. Die Patch-Datei enthält alle Dateinamen im absoluten Pfadformat (von root ). Wenn wir also von /usr/src aus ohne die Option „-p“ ausführen, wird es nicht richtig funktionieren.

-p3 weist den Patch-Befehl an, 3 führende Schrägstriche von den in der Patch-Datei vorhandenen Dateinamen zu überspringen. In unserem Fall lautet der Dateiname in der Patch-Datei „/usr/src/openvpn-2.3.2/alocal.m4“, da Sie „-p3“ angegeben haben, 3 führende Schrägstriche, d. h. bis /usr/src/ wird ignoriert.

5. Erstellen Sie mit -b

eine Sicherungskopie, bevor Sie den Patch anwenden

Sie können eine Sicherungskopie der Originaldatei erstellen, bevor Sie den Patch-Befehl anwenden, indem Sie die Option -b wie unten gezeigt verwenden.

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

Jetzt haben Sie einen Dateinamen „hello.c.orig“, der die Sicherung der ursprünglichen hello.c ist.

Sie können auch -V verwenden, um das Format des Sicherungsdateinamens festzulegen, wie unten gezeigt. Jetzt haben Sie einen Dateinamen „hello.c.~1~“.

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

6. Validieren Sie den Patch, ohne ihn anzuwenden (Probelauf-Patch-Datei)

Sie können den Patch-Befehl trocken ausführen, um zu sehen, ob Sie irgendwelche Fehler erhalten, ohne die Datei zu patchen, indem Sie die Option –dry-run verwenden, wie unten gezeigt.

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

Sie können sehen, dass hello.c überhaupt nicht geändert wird.

7. Einen bereits angewendeten Patch rückgängig machen (Patch rückgängig machen)

Sie können die Option -R verwenden, um einen bereits angewendeten Patch rückgängig zu machen.

$ 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

Sie können an der Dateigröße erkennen, dass der Patch, der bereits angewendet wurde, rückgängig gemacht wird, wenn wir die Option -R verwenden.


Linux
  1. mv-Befehl unter Linux:7 wesentliche Beispiele

  2. Beispiele für Linux-Tail-Befehle

  3. file Befehlsbeispiele in Linux

  4. diff-Befehlsbeispiele in Linux

  5. Binärer Diff/Patch für große Dateien unter Linux?

lsof-Befehl unter Linux (10 Beispiele)

Touch-Befehl in Linux (5 Beispiele)

Linux-WC-Befehl mit Beispielen

Beispiele für Linux-Diff-Befehle

Linux cat-Befehlsbeispiele

Linux gzip-Befehlsbeispiele