GNU/Linux >> Tutoriales Linux >  >> Linux

7 ejemplos de comandos de parches para aplicar archivos de parches de diferencias en Linux

Cuando hay una solución de seguridad disponible para un software en particular, generalmente hacemos una actualización binaria usando las herramientas de administración de paquetes como yum o apt-get.

Pero, puede haber una situación en la que haya instalado un software compilándolo desde el código fuente.

En esa situación, ¿cómo se aplica la solución de seguridad al software?

La respuesta es descargar el parche de seguridad y aplicarlo al código fuente original y volver a compilar el software.

Este tutorial explica cómo crear un archivo de parche usando diff y aplicarlo usando el comando patch.

Un archivo de parche es un archivo de texto que contiene las diferencias entre dos versiones del mismo archivo (o del mismo árbol fuente). El archivo de parche se crea usando el comando diff.

1. Crear un archivo de parche usando diff

Para entender esto, creemos un pequeño programa en C llamado hello.c

#include <stdio.h> 

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

Ahora, copia hello.c a hello_new.c

$ cp hello.c hello_new.c

Edite hello_new.c como se muestra a continuación para realizar algunos pequeños cambios:

#include <stdio.h>

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

Finalmente, cree el archivo de parche usando el comando diff como se muestra a continuación:

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

El comando anterior creará un archivo de parche llamado "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. Aplicar archivo de parche usando el comando de parche

El comando "patch" toma un archivo de parche como entrada y aplica las diferencias a uno o más archivos originales, produciendo versiones parcheadas.

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

Utilice el comando de parche como se muestra a continuación para aplicar hello.patch al código fuente original de hello.c.

$ patch < hello.patch
patching file hello.c

El archivo hello.patch contiene el nombre del archivo que se va a parchar. Una vez que el archivo esté parcheado, tanto hello.c como hello_new.c tendrán el contenido.

3. Crear un parche a partir de un árbol de fuentes

El ejemplo anterior era tan simple que solo funciona con un archivo. Veremos cómo crear y aplicar un parche para un árbol fuente completo tomando como ejemplo el código fuente "openvpn".

He descargado 2 versiones de openvpn, openvpn-2.3.2 y openvpn-2.3.4.

tar -xvzf openvpn-2.3.2.tar.gz

tar -xvzf openvpn-2.3.4.tar.gz

Ahora crearemos el parche usando el siguiente comando.

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

El comando anterior operará recursivamente y encontrará las diferencias, y colocará esas diferencias en el archivo de parche.

4. Aplicar archivo de parche a un árbol de código fuente

Los siguientes comandos de parche se pueden usar para aplicar el parche al árbol fuente.

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

Tenga en cuenta que estamos ejecutando el comando desde /usr/src/. El archivo de parche contiene todos los nombres de archivo en formato de ruta absoluta (desde la raíz). Entonces, cuando ejecutamos desde /usr/src, sin la opción "-p", no funcionará correctamente.

-p3 le dice al comando de parche que omita 3 barras inclinadas iniciales de los nombres de archivo presentes en el archivo de parche. En nuestro caso, el nombre de archivo en el archivo de parche es "/usr/src/openvpn-2.3.2/aclocal.m4", ya que ha dado "-p3", 3 barras inclinadas, es decir, hasta que se ignore /usr/src/.

5. Realice una copia de seguridad antes de aplicar el parche usando -b

Puede realizar una copia de seguridad del archivo original antes de aplicar el comando de parche usando la opción -b como se muestra a continuación.

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

Ahora tendrá un nombre de archivo "hello.c.orig", que es la copia de seguridad del hello.c original.

También puede usar -V para decidir el formato del nombre del archivo de respaldo como se muestra a continuación. Ahora tendrá un nombre de archivo "hello.c.~1~".

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

6. Valide el parche sin aplicar (archivo de parche de ejecución en seco)

Puede ejecutar en seco el comando de parche para ver si obtiene algún error, sin parchear el archivo usando la opción de ejecución en seco como se muestra a continuación.

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

Puede ver que hello.c no se modifica en absoluto.

7. Revertir un parche que ya se aplicó (deshacer un parche)

Puede usar la opción -R para revertir un parche que ya se aplicó.

$ 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

Puede notar en el tamaño del archivo que el parche, que ya está aplicado, se invierte cuando usamos la opción -R.


Linux
  1. Ejemplos de comandos de cola de Linux

  2. 5 ejemplos de comandos Wget para descargar archivos en Linux.

  3. 10 ejemplos de comandos Cat para administrar archivos en Linux / UNIX

  4. Ejemplos de comandos ln en Linux

  5. Ejemplos de comandos de archivo en Linux

Comando lsof en Linux (10 ejemplos)

Comando táctil en Linux (5 ejemplos)

Comando WC de Linux con ejemplos

Ejemplos de comandos diff de Linux

Ejemplos de comandos cat de Linux

Ejemplos de comandos gzip de Linux