GNU/Linux >> Linux Esercitazione >  >> Linux

7 Esempi di comandi di patch per applicare i file di patch Diff in Linux

Quando è disponibile una correzione di sicurezza per un particolare software, in genere eseguiamo un aggiornamento binario utilizzando gli strumenti di gestione dei pacchetti come yum o apt-get.

Tuttavia, potrebbe esserci una situazione in cui hai installato un software compilandolo dal codice sorgente.

In queste situazioni, come si applica la correzione di sicurezza al software?

La risposta è scaricare la patch di sicurezza e applicarla al codice sorgente originale e ricompilare il software.

Questo tutorial spiega come creare un file di patch usando diff e applicarlo usando il comando patch.

Un file di patch è un file di testo che contiene le differenze tra due versioni dello stesso file (o dello stesso albero dei sorgenti). Il file di patch viene creato utilizzando il comando diff.

1. Crea un file di patch usando diff

Per capirlo, creiamo un piccolo programma C chiamato hello.c

#include <stdio.h> 

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

Ora copia hello.c in hello_new.c

$ cp hello.c hello_new.c

Modifica hello_new.c come mostrato di seguito per apportare alcune piccole modifiche:

#include <stdio.h>

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

Infine, crea il file della patch usando il comando diff come mostrato di seguito:

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

Il comando precedente creerà un file di patch chiamato "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. Applica il file di patch utilizzando il comando Patch

Il comando "patch" prende un file di patch come input e applica le differenze a uno o più file originali, producendo versioni con patch.

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

Usa il comando patch come mostrato di seguito per applicare hello.patch al codice sorgente hello.c originale.

$ patch < hello.patch
patching file hello.c

Il file hello.patch contiene il nome del file da correggere. Una volta che il file è stato corretto, sia hello.c che hello_new.c avranno il contenuto.

3. Crea una patch da un albero di origine

L'esempio sopra era così semplice che funziona solo con un file. Vedremo come creare e applicare patch per un albero completo dei sorgenti prendendo come esempio il codice sorgente “openvpn”.

Ho scaricato la versione 2 di openvpn, openvpn-2.3.2 e openvpn-2.3.4.

tar -xvzf openvpn-2.3.2.tar.gz

tar -xvzf openvpn-2.3.4.tar.gz

Ora creeremo la patch usando il seguente comando.

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

Il comando precedente funzionerà in modo ricorsivo e troverà le differenze e le posizionerà nel file di patch.

4. Applica il file di patch a un albero del codice sorgente

I seguenti comandi di patch possono essere usati per applicare la patch all'albero dei sorgenti.

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

Tieni presente che stiamo eseguendo il comando da /usr/src/. Il file di patch contiene tutti i nomi di file in formato di percorso assoluto (da root). Quindi, quando eseguiamo da /usr/src, senza l'opzione "-p", non funzionerà correttamente.

-p3 dice al comando patch di saltare 3 barre iniziali dai nomi di file presenti nel file di patch. Nel nostro caso, il nome del file nel file di patch è “/usr/src/openvpn-2.3.2/aclocal.m4”, poiché hai dato “-p3”, 3 barre iniziali, cioè finché /usr/src/ non viene ignorato.

5. Eseguire un backup prima di applicare la patch utilizzando -b

Puoi fare un backup del file originale prima di applicare il comando patch usando l'opzione -b come mostrato di seguito.

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

Ora avrai un nome file "hello.c.orig", che è il backup dell'originale hello.c.

Puoi anche usare -V per decidere il formato del nome del file di backup come mostrato di seguito. Ora avrai un nome file "ciao.c.~1~".

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

6. Convalida la patch senza applicarla (file patch eseguito a secco)

Puoi eseguire a secco il comando patch per vedere se stai ricevendo errori, senza correggere il file usando l'opzione –dry-run come mostrato di seguito.

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

Puoi vedere che hello.c non è affatto modificato.

7. Annulla una patch già applicata (Annulla una patch)

Puoi usare l'opzione -R per annullare una patch già applicata.

$ 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

Puoi notare dalla dimensione del file che la patch, che è già applicata, è invertita quando abbiamo usato l'opzione -R.


Linux
  1. Comando mv in Linux:7 esempi essenziali

  2. Esempi di comandi tail di Linux

  3. 5 Esempi di comandi Wget per scaricare file in Linux.

  4. file Esempi di comandi in Linux

  5. Esempi di comandi diff in Linux

lsof Command in Linux (10 esempi)

Touch Command in Linux (5 esempi)

Comando Linux WC con esempi

Esempi di comandi di Linux diff

Esempi di comandi di Linux cat

Esempi di comandi gzip di Linux