GNU/Linux >> Tutoriels Linux >  >> Linux

7 exemples de commandes de patch pour appliquer des fichiers de patch Diff sous Linux

Lorsqu'un correctif de sécurité est disponible pour un logiciel particulier, nous effectuons généralement une mise à niveau binaire à l'aide d'outils de gestion de packages tels que yum ou apt-get.

Mais, il peut arriver que vous ayez installé un logiciel en le compilant à partir du code source.

Dans ces situations, comment appliquez-vous le correctif de sécurité au logiciel ?

La réponse est de télécharger le correctif de sécurité et de l'appliquer au code source d'origine et de recompiler le logiciel.

Ce didacticiel explique comment créer un fichier de correctif à l'aide de diff et l'appliquer à l'aide de la commande patch.

Un fichier patch est un fichier texte qui contient les différences entre deux versions du même fichier (ou de la même arborescence source). Le fichier de correctif est créé à l'aide de la commande diff.

1. Créer un fichier patch en utilisant diff

Pour comprendre cela, créons un petit programme C nommé hello.c

#include <stdio.h> 

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

Maintenant, copiez le hello.c dans hello_new.c

$ cp hello.c hello_new.c

Modifiez le hello_new.c comme indiqué ci-dessous pour apporter quelques petites modifications :

#include <stdio.h>

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

Enfin, créez le fichier de correctif à l'aide de la commande diff comme indiqué ci-dessous :

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

La commande ci-dessus créera un fichier de correctif nommé "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. Appliquer le fichier correctif à l'aide de la commande Patch

La commande "patch" prend un fichier patch en entrée et applique les différences à un ou plusieurs fichiers originaux, produisant des versions corrigées.

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

Utilisez la commande patch comme indiqué ci-dessous pour appliquer le hello.patch au code source hello.c d'origine.

$ patch < hello.patch
patching file hello.c

Le fichier hello.patch contient le nom du fichier à patcher. Une fois le fichier corrigé, hello.c et hello_new.c auront le contenu.

3. Créer un patch à partir d'un arbre source

L'exemple ci-dessus était si simple qu'il ne fonctionne qu'avec un seul fichier. Nous verrons comment créer et appliquer un correctif pour une arborescence complète des sources en prenant comme exemple le code source "openvpn".

J'ai téléchargé 2 versions d'openvpn, openvpn-2.3.2 et openvpn-2.3.4.

tar -xvzf openvpn-2.3.2.tar.gz

tar -xvzf openvpn-2.3.4.tar.gz

Nous allons maintenant créer le patch en utilisant la commande suivante.

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

La commande ci-dessus fonctionnera de manière récursive et trouvera les différences, puis placera ces différences dans le fichier de correctif.

4. Appliquer le fichier correctif à une arborescence de code source

Les commandes de patch suivantes peuvent être utilisées pour appliquer le patch à l'arborescence source.

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

Veuillez noter que nous exécutons la commande depuis /usr/src/. Le fichier de correctif contient tous les noms de fichiers au format de chemin absolu (depuis la racine). Ainsi, lorsque nous exécutons depuis /usr/src, sans l'option "-p", cela ne fonctionnera pas correctement.

-p3 indique à la commande patch d'ignorer 3 barres obliques dans les noms de fichiers présents dans le fichier de correctif. Dans notre cas, le nom de fichier dans le fichier patch est "/usr/src/openvpn-2.3.2/aclocal.m4", puisque vous avez donné "-p3", 3 barres obliques, c'est-à-dire jusqu'à ce que /usr/src/ soit ignoré.

5. Effectuez une sauvegarde avant d'appliquer le correctif à l'aide de -b

Vous pouvez faire une sauvegarde du fichier d'origine avant d'appliquer la commande patch en utilisant l'option -b comme indiqué ci-dessous.

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

Vous aurez maintenant un nom de fichier "hello.c.orig", qui est la sauvegarde de l'original hello.c.

Vous pouvez également utiliser -V pour décider du format du nom de fichier de sauvegarde, comme indiqué ci-dessous. Vous aurez maintenant un nom de fichier "hello.c.~1~".

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

6. Valider le correctif sans appliquer (fichier de correctif à sec)

Vous pouvez exécuter à sec la commande patch pour voir si vous obtenez des erreurs, sans corriger le fichier en utilisant l'option –dry-run comme indiqué ci-dessous.

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

Vous pouvez voir que hello.c n'est pas du tout modifié.

7. Inverser un patch déjà appliqué (annuler un patch)

Vous pouvez utiliser l'option -R pour inverser un patch déjà appliqué.

$ 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

Vous pouvez remarquer à partir de la taille du fichier, que le correctif, qui est déjà appliqué, est inversé lorsque nous avons utilisé l'option -R.


Linux
  1. Exemples de commandes Linux tail

  2. 5 Exemples de commandes Wget pour télécharger des fichiers sous Linux.

  3. 10 exemples de commandes Cat pour gérer des fichiers sous Linux / UNIX

  4. ln Exemples de commandes sous Linux

  5. file Exemples de commandes sous Linux

Commande lsof sous Linux (10 exemples)

Commande Touch sous Linux (5 exemples)

Commande Linux WC avec exemples

Exemples de commande Linux diff

Exemples de commande Linux cat

Exemples de commande Linux gzip