GNU/Linux >> Znalost Linux >  >> Linux

7 Příklady příkazů Patch pro použití souborů oprav rozdílů v systému Linux

Pokud je pro konkrétní software k dispozici oprava zabezpečení, obvykle provedeme binární upgrade pomocí nástrojů pro správu balíčků, jako je yum nebo apt-get.

Může však nastat situace, kdy jste nainstalovali software kompilací ze zdrojového kódu.

Jak v takové situaci použijete opravu zabezpečení na software?

Řešením je stáhnout bezpečnostní opravu a aplikovat ji na původní zdrojový kód a znovu zkompilovat software.

Tento tutoriál vysvětluje, jak vytvořit soubor opravy pomocí diff a použít jej pomocí příkazu patch.

Opravný soubor je textový soubor, který obsahuje rozdíly mezi dvěma verzemi stejného souboru (nebo stejného zdrojového stromu). Patch soubor je vytvořen pomocí příkazu diff.

1. Vytvořte soubor opravy pomocí diff

Abychom to pochopili, vytvořte malý program v C s názvem hello.c

#include <stdio.h> 

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

Nyní zkopírujte hello.c do hello_new.c

$ cp hello.c hello_new.c

Upravte soubor hello_new.c, jak je uvedeno níže, abyste provedli několik malých změn:

#include <stdio.h>

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

Nakonec vytvořte soubor opravy pomocí příkazu diff, jak je znázorněno níže:

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

Výše uvedený příkaz vytvoří soubor opravy s názvem „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. Použijte soubor opravy pomocí příkazu Patch

Příkaz „patch“ bere jako vstup soubor opravy a aplikuje rozdíly na jeden nebo více původních souborů, čímž vytváří opravené verze.

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

Pomocí příkazu patch, jak je ukázáno níže, použijte hello.patch na původní zdrojový kód hello.c.

$ patch < hello.patch
patching file hello.c

Soubor hello.patch obsahuje název souboru, který má být opraven. Jakmile bude soubor opraven, obsah bude mít hello.c i hello_new.c.

3. Vytvořte opravu ze stromu zdroje

Výše uvedený příklad byl tak jednoduchý, že funguje pouze s jedním souborem. Ukážeme si, jak vytvořit a aplikovat záplatu pro kompletní zdrojový strom na příkladu zdrojového kódu „openvpn“.

Stáhl jsem si 2 verze openvpn, openvpn-2.3.2 a openvpn-2.3.4.

tar -xvzf openvpn-2.3.2.tar.gz

tar -xvzf openvpn-2.3.4.tar.gz

Nyní vytvoříme záplatu pomocí následujícího příkazu.

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

Výše uvedený příkaz bude fungovat rekurzivně a najde rozdíly a umístí tyto rozdíly do souboru opravy.

4. Použijte soubor oprav na strom zdrojového kódu

Následující příkazy opravy lze použít k aplikaci opravy na zdrojový strom.

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

Upozorňujeme, že příkaz provádíme z /usr/src/. Opravný soubor obsahuje všechny názvy souborů ve formátu absolutní cesty (od uživatele root). Takže když spustíme z /usr/src bez volby „-p“, nebude to fungovat správně.

-p3 říká příkazu patch, aby vynechal 3 úvodní lomítka z názvů souborů přítomných v souboru opravy. V našem případě je název souboru v souboru opravy „/usr/src/openvpn-2.3.2/aclocal.m4“, protože jste zadali „-p3“, 3 úvodní lomítka, tj. dokud /usr/src/ není ignorováno.

5. Před použitím opravy proveďte zálohu pomocí -b

Před použitím příkazu patch si můžete vytvořit zálohu původního souboru pomocí volby -b, jak je uvedeno níže.

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

Nyní budete mít název souboru „hello.c.orig“, což je záloha původního hello.c.

Můžete také použít -V k určení formátu souboru zálohy, jak je uvedeno níže. Nyní budete mít název souboru „hello.c.~1~“.

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

6. Ověřte opravu bez použití (soubor opravy spusťte nasucho)

Příkaz patch můžete nasucho spustit, abyste zjistili, zda se neobjevují nějaké chyby, aniž byste museli soubor opravovat pomocí možnosti –dry-run, jak je uvedeno níže.

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

Vidíte, že hello.c není vůbec upraveno.

7. Vrácení opravy, která je již použita (Vrácení opravy)

Můžete použít volbu -R ke zrušení opravy, která je již aplikována.

$ 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

Z velikosti souboru si můžete všimnout, že patch, který je již aplikován, je obrácený, když jsme použili volbu -R.


Linux
  1. 5 příkladů příkazů Wget ke stažení souborů v Linuxu.

  2. Příklady příkazů diff v Linuxu

  3. Binární rozdíl/patch pro velké soubory na linuxu?

  1. Příkaz mv v Linuxu:7 základních příkladů

  2. Příklady příkazů Linux tail

  3. 10 příkladů příkazů Cat pro správu souborů v systému Linux / UNIX

  1. 8 Příklady příkazů hlavy v Linuxu

  2. V příkladech příkazů v Linuxu

  3. soubor Příklady příkazů v Linuxu