patch 命令用法詳解

patch,是打補丁的命令,有很多用法,見幫助#man patch

patch -p0       (“p”指的是路徑,後面的數字表示去掉路徑的第幾部分。"0",表示不去掉,爲全路徑)

patch -p1       (“p”後面的數字"1",表示去掉前第一個路徑)

fetch http://people.freebsd.org/~delphij/misc/patch-bge-releng62

fetch http://people.freebsd.org/~delphij/misc/patch-bce-watchdog-rewrite

cd /sys/dev/bge

fetch ...

patch -p0 < ...

fetch http://people.freebsd.org/~delphij/misc/patch-tcp_auto_buf-20061212-RELENG_6.diff

patch -p < patch-tcp_auto_buf-20061212-RELENG_6.diff

也可以把文件中的目錄全改成系統已在的目錄如/usr/src/sys.....

注意:

1,確認目錄

然後確認目錄,如不在默認目錄下,就寫下要打補丁的當前絕對目錄。如/usr/src/sys/dev/bge/if_bce.c

2,P的使用

可以使用不帶數字的參數。

patch 後的軟件安裝

 

telnetd服務器的問題及補丁

在當前FreeBSD所有版本中,也就是FreeBSD 5.0、FreeBSD 4.3、FreeBSD 4.2、FreeBSD 4.1.1、FreeBSD 4.1、FreeBSD 4.0、FreeBSD 3.x、FreeBSD 2.x的版本,其telnetd守護進程中存在一個致命的緩衝區溢出漏洞,該問題是由於telnetd在處理telnet協議選項的函數中沒有進行有效的 邊界檢查,當使用某些選項('AYT')時,可能發生緩衝區溢出。這會導致遠程root級別的安全威脅。

因此,如果一定要使用telnet服務的話,必須爲服務器打上最新的patch,該patch可以從以下鏈接獲得:

(注:通常有兩個版本的telnetd服務器,有crypto及無crypto的版本,因此 需要判斷主機使用的是哪種版本的telnetd,這通常可以通過察看src文件來判斷,比如# ls /usr/src/crypto/telnet/telnetd,如果不存在,則說明使用的是無crypto的版本了,在判別清楚之後再分別下載相關補丁 文件)

crypto版本補丁:

ftp://ftp.freebsd.org/pub/FreeBSD/CERT/patches/SA-01:49/telnetd-crypto.patch

ftp://ftp.freebsd.org/pub/FreeBSD/CERT/patches/SA-01:49/telnetd-crypto.patch.asc

patch方法:

# cd /usr/src/

# patch -p < /path/to/patch

# cd /usr/src/secure/libexec/telnetd

# make depend && make all install

無crypto版本補丁:

ftp://ftp.freebsd.org/pub/FreeBSD/CERT/patches/SA-01:49/telnetd.patch

ftp://ftp.freebsd.org/pub/FreeBSD/CERT/patches/SA-01:49/telnetd.patch.asc

patch方法:

# cd /usr/src/

# patch -p < /path/to/patch

# cd /usr/src/libexec/telnetd

# make depend && make all install

例子來源http://toby.bokee.com/

文件:isp1161-2.6.12.patch(在/root下)

由於patch文件的首行已經指明瞭路徑,所以根據當前所在的目錄,加不同的參數使用patch命令:

1:如果當前的目錄是和linux-2.6.12的同級目錄:

[root@kcn-110mw]#patch -p0 </root/isp1161-2.6.12.patch

2:如果當前的目錄爲 linux-2.6.12/:

[root@kcn-110mw]#patch -p1 </root/isp1161-2.6.12.patch

3:如果當前的目錄爲 linux-2.6.12/drivers/:

[root@kcn-110mw]#patch -p2 </root/isp1161-2.6.12.pathc

0,1,2,是指略去的patch文件中的前幾級目錄。

ln 命令的使用

這是linux中一個非常重要的命令。它的功能是爲某一個文件在另外一個位置建立一個不同的鏈接,這個命令最常用的參數是-s,具體用法是:ln -s 源文件 目標文件。

當我們需要在不同的目錄,用到相同的文件時,我們不需要在每一個需要的目錄下都放一個必須相同的文件,我們只要在某個固定的目錄放上該文件,然後在其它的目錄下用ln命令鏈接(link)它就可以,不必重複的佔用磁盤空間。

例如:ln -s /bin/less /usr/local/bin/less

-s 是代號(symbolic)的意思。

這裏有兩點要注意:

第一,ln命令會保持每一處鏈接文件的同步性。也就是說,不論你改動了哪一處,其它的文件都會發生相同的變化。

 

patch附帶有一個很好的幫助,其中羅列了很多選項,但是99%的時間只要兩個選項就能滿足我們的需要:

  patch -p1 < [patchfile]

  patch -R < [patchfile] (used to undo a patch)

  -p1選項代表patchfile中文件名左邊目錄的層數,頂層目錄在不同的機器上有所 不同。要使用這個選項,就要把你的patch放在要被打補丁的目錄下,然後在這個目錄中運行path -p1 < [patchfile]。來自Linux內核patch的一個簡短的引用可以這樣實現:

  diff -u --recursive --new-file v2.1.118/linux/mm/swapfile.c linux/mm/swapfile. c--- v2.1.118/linux/mm/swapfile.c Wed Aug 26 11:37:45 1998 +++ linux/mm/swapfile.c Wed Aug 26 16:01:57 1998 @@ -489,7 +489,7 @@

  int swap_header_version;

  int lock_map_size = PAGE_SIZE;

  int nr_good_pages = 0; - char tmp_lock_map = 0; + unsigned long tmp_lock_map = 0;

  應用來自本段中使用-p1開關拷貝的patch可以有效地減短patch定位的路 徑;patch會查找當前目錄下一個名爲/mm的子目錄,接着應該會在這兒發現swapfile.c文件,然後等待打補丁。在這個過程中,以破折號 (“-”號,譯者注)開始的行會被一個以加號(“+”號,譯者注)開始的行代替。一個典型的patch會包含對多個文件的更新,每個部分中都由對兩個版本 的文件運行diff -u命令的輸出結果組成。

  patch在操作時把自己的輸出結果顯示在屏幕上,但是這種輸出通常都滾屏太快,來不及觀看。原來準備patch的文件名爲*.orig,新的patch文件會覆蓋這個初始文件名。

打補丁的問題

  使用不同版本的patch問題來源可能不同,所有的版本在網絡上都是可用的。Larry Wall近年來已經不再做很多工作來更新patch了,這可能是由於他最後發行的一個版本在大部分情況下都能正常運行。最近幾年以來,一直是GNU項目的 FSF程序員發行新版本的patch。他們首先修訂有問題的patch,但是我最近一直使用沒有問題的2.5版本(這是Debian2.0的發行版本 號)。過去,我的2.1版本也一直運行的很好。當前的GNU patch的版本可以從GNU FTP站點上獲取,然而大部分人都只使用他們Linux發行版中所提供的版本。

  讓我們假定你已經對一個目錄下的源程序文件進行了patch修補工作,但是patch並 沒有清晰地發揮作用。這可能會偶然發生,在打補丁的過程中會顯示錯誤信息,其中帶有行號,說明哪一個文件出現了問題。有時錯誤是很明顯的,例如缺少了分 號,這種錯誤可以不費多大力氣就能改正。另外一種可能是從 patch部分刪除了產生問題的部分,但是這樣根據所涉及到的文件的不同可能會正常工作,也可能不能正常工作了。

  另外一種常見的錯位爲:假設你有一個未使用tar打包的內核源程序文件,在/linux /arch/下瀏覽各個子目錄時你會發現各種機器體系結構子目錄,例如alpah、sparc等等。如果你和大多數Linux用戶一樣,使用的是 Intel的處理器(或者是Intel系列),你可以決定刪除這些目錄,這些目錄對於編譯你特殊的內核並不需要,只是白白佔用了磁盤空間。一段時間之後發 行了一個新的內核patch,此時試圖進行patch操作,當它發現不能找到自己打補丁需要的Alpha或者PPC文件,就會停頓下來。幸運的是 patch在這些地方允許用戶參與,它會詢問"Skip this patch?"回答"y",patch就可以按照正確的路徑繼續執行。也許你需要回答這個問題很多次,因此允許自己不需要的目錄保留在磁盤上是一種很好的 方法。

給內核打補丁的技巧

  很多Linux用戶使用patch都主要是給內核源程序打補丁,因此有一些技巧可以使 用。可能最簡單的方法是使用shell腳本給內核打補丁,這可以在內核源程序樹中的/scripts子目錄中找到。這種方便的、編寫良好的腳本是由 Nick Holloway在1995年編寫的;兩年以後,Adam Sulmicki增加了多種壓縮格式的支持,包括*.bz、*.bz2、compress、gzip和無格式文本(也就是已經解壓的patch)。這個腳 本假定在你使用新版本的patch時,你的內核源程序是在/usr/src/linux目錄中。這些缺省值可以通過這種格式的命令行開關覆蓋:patch -kernel [sourcedir [patchdir] ]。如果任何一部分的patch失敗,對內核打補丁的過程都會失敗,但是如果patch清晰地起作用,它就會調用find,這會刪除所有的patch留下 的*.orig文件。

  如果你準備查看命令的輸出,或者可能你希望保留*.orig文件直到你確定打過補丁的源 程序編譯已經通過,按照我的經驗,直接運行patch(正如前面介紹的一樣,patch位於內核源程序的最高目錄)是很可靠的。爲了避免對patch進行 解壓,在使用之前,可以使用這樣一個技巧:

  gzip -cd patchXX.gz | patch -p1

  或者

  bzip2 -dc patchXX.bz2 | patch -p1

  在使用patch之後,可以使用find程序來檢測被拒絕的文件:

  find . -name *.rej

  第一次使用這個命令,語法可能有些不清楚。點號(“.”)說明find應該查找當前目錄 並遞規查找當前目錄之下的所有子目錄。記住,點號前後都應該有一個空格。通配符"*"號前面的反斜線把星號轉義出來,以免shell會搞混,星號是有其它 意義的。如果find找到了任何的*.rej文件,它就會把文件名打印到屏幕上。如果沒有任何輸出find就退出了,那麼就差不多能確定patch正確發 揮作用了。

  find的另外一個工作是刪除*.orig文件:

  find . -name *.orig -print0 | xargs -0r rm -f

  這個命令敲起來相當麻煩,可以使用一個新的shell別名來代替這個命令。在你的~/.bashrc文件中類似這樣的一行:

  alias findorig 'find . -name *.orig -print0 | xargs -0r rm -f'

  可以允許你只輸入findorig就可以調用前面的命令。如果別名命令的定義中包含空格,那麼就必須使用單引號。爲了不用先退出再重新登陸就可以使用一個新的別名,可以在命令行中敲如~/.bashrc。第三,軟鏈接是可以跨分區的,但是硬鏈接只能在同一分區內。  

如果你用ls察看一個目錄時,發現有的文件或文件夾的顏色和別的不一樣,藍色的,那就是一個用ln命令生成的文件,用ls -l命令去察看,就可以看到顯示的link的路徑了。第二,ln 的鏈接又軟鏈接和硬鏈接兩種。軟鏈接就是ln -s ** **,它只會在你選定的位置上生成一個文件的鏡像,不會佔用磁盤空間,硬鏈接ln ** **,沒有參數-s, 它會在你選定的位置上生成一個和源文件大小相同的文件,無論是軟鏈接還是硬鏈接,文件都保持同步變化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章