mirror(1) | General Commands Manual | mirror(1) |
mirror - 映射在遠端節點上的檔案
mirror [flags] -gsite:pathname mirror [flags] [package-files]
Mirror 是以 Perl 所寫成的一套在執行它的機器與一臺遠端主機 之間使用 ftp 協定複製整個目錄架構及其內容的軟體。它藉由在 傳輸之前比較檔案時間(time-stamps) 以及大小來避免拷貝不必要 的檔案。除此之外,它還可以選擇性地壓縮(compress, gzip)以及 分割(split)檔案。
它是寫給檔案維護人員使用的但也可以讓任何想要經由 ftp 傳輸 大量檔案的人使用。
無論如何叫用它, mirror 總是執行相同的幾個基本步驟。它連線 到遠端節點,在內部建立本地目標目錄(target direction)的目錄 列表,爲遠端目錄建立一份目錄列表,比較它們,建立任何必須的 子目錄,傳輸適當的檔案(設定它們的檔案時間以符合遠端節點上 的檔案時間),建立任何符號鏈結,然後移除任何已不必要的物件 (objects) 最後並結束連線。
Mirror 可以處理符號鏈結但並非原本的鏈結。它不會複製擁有者 (owner)或是羣組(group)的資訊。如果你需要這些選項其中的任何 一個,使用 rdist(1) 來取代它。
Mirror 系以上面所列語法概述其中的一種方法呼叫執行。
第一種方式是用來將一個遠端目錄擷取回現行目錄。如果你要映射 的是一個目錄,最好是以斜線('/') 來結束路徑名稱這樣一來遠端 遞迴列表(包含往下子目錄的列表)會比較小或者是使用 -r 旗標 來禁止遞迴(參閱下面所述的 -g 旗標)。這個方式將不會使用到 mirror.defaults 檔案。
在上面所列語法概述的第二種方式裏,至少需要有一份最少數目的 參數而且 mirror 是由從配置檔案(或標準輸入)裏讀取的設定所 控制。如果可以在 mirror 執行檔所在目錄或是 PERLLIB 路徑裏 找到一個名爲 mirror.defaults 檔案,那麼它會首先被載入。這 用來爲所有的配置檔提供一般化的預設值。
Mirror 本來是爲映射遠端 Un*x 系統的檔案而寫,但是它已逐漸 成長(like topsy)。
取得給定節點上的所有檔案。如果路徑符合 .*/.+ 那麼 它是目錄的名稱而後面的部份則是所要取得之檔案名稱的 樣板(pattern)。 如果路徑符合 .*/ 則它是目錄的名稱 而且其所有的內容都將會被擷取。另一方面路徑還是用 在 '/' 的樣板。如果你使用 host:/fred 的話,那麼將作出 一份遠端主機上之 / 的完整目錄列表。如果所有你想要 的是目錄 /fred 的內容,則指定 host:/fred/ 纔是。
配置檔會被剖析成一系列的敘述。空白行及以雜湊(hash)符號起始 的行會被忽略。每個敘述的形式都是
關鍵字=值
或是
關鍵字+值
你可以在關鍵字以及等號/加號的前面加上空白字元。所有緊跟在 等號/加號之後的每樣事物都是一個值,這包含任何開頭或結尾的 空白字元。等號的版本會將關鍵字設定爲該值,而加號的版本會將 該值連結到預設值的結尾上。
一個敘述可以在除最後一行以外使用 ampersand('&') 字元作結束 以連續超過多行。尾隨在 ampersand 之後的行,都會以移除所有 開頭空白字元的方式附加到目前所在行的後面。
這裏是一份關鍵字的列表而且它們預設的值放在 square brackets 裏面列出。以星號標出的選項目前還沒有實作出來。
雖然有很多關鍵字可以設定,內建的預設值將可處理大部分的情況 。一般只需要設定 package, site, remote_dir 以及 local_dir 即可。
每一組關鍵字定義如何映射一份特定的檔案包裹而且應該要以一行 唯一的 package 開始。檔案包裹的名稱用在產生報告及 -p 參數 上,所以應使用較具記憶性的名稱。定義每個檔案包裹所需的最小 需求是 package, site, remote_dir 以及 local_dir 。一旦找到 一行 package 敘述,所有的預設值都會重設。
如果 package 的名稱是 defaults 的話,則不會連線到任何節點 去,但是所給任何關鍵字的預設值都會改變。一般而言所有的預設 值都在 mirror.defaults 這個將會在任何 package 細節前自動 載入的檔案裏。
# Sample mirror.defaults package=defaults # The LOCAL hostname - if not the same as `hostname` returns # (I advertise the name src.doc.ic.ac.uk but the machine is # really puffin.doc.ic.ac.uk.) hostname=src.doc.ic.ac.uk # Keep all local_dirs relative to here local_dir=/public/ remote_password=ukuug-soft@doc.ic.ac.uk
如果檔案包裹不是 defaults 的話,則 mirror 將會執行下列步驟 。除非偵測出一個內部錯誤,任何錯誤都將會使得目前的檔案包裹 被跳過並且嘗試下一個。
如果 mirror 並非已經連上該節點,它將會從任何已經連上的節點 離線並嘗試連線到遠端節點的 ftp 伺服程式去。它接著將會使用 所給的遠端使用者名稱及密碼簽入。一旦連上, mirror 開啓二進 位傳輸模式。接下來它切換到所給的本地目錄並掃描之以取得已經 存在的本地檔案的細節。如果必要,將會建立本地目錄。一旦這項 作業完成,會以類似的方式掃描遠端目錄。 Mirror 系切換到遠端 目錄並執行 ftp LIST 指令,然後依據 recursive 選項的值傳遞 flags_recursive 選項或 flags_nonrecursive 選項來完成。此外 也可以擷取一個包含有目錄列表的檔案。每一個遠端路徑名稱都將 會執行任何指定的對映(mapping) 以建立本地路徑名稱。然後任何 由 exclude_patt, max_days, get_newer 以及 get_size_change 關鍵字指定的檢驗都會施行在檔案或符號鏈結上。只有 exclude- patt 檢驗會施行在子目錄上。
上述過程建立一份所有需要的遠端檔案以及要儲存它們之本地路徑 名稱的列表。
一旦目錄列表完成,所有需要的檔案都會從遠端節點擷取到它們的 本地路徑名稱。作法是把檔案擷取到目標目錄裏的暫存檔。如果有 需要,暫存檔會被壓縮(compressed, gzip'ed) 或是切割(或者是 壓縮後再切割)。當傳輸成功後再把暫存檔改名。
Mirror 使用遠端目錄列表以找出可以取得哪些檔案。 Mirror 本 來的目標是連線到 unix 的 ftp 伺服程式使用標準的 ls 指令。 要使用於非標準 ls 的 unix 主機或非 unix 的主機上它必須要設 remote_fs 變數以符合將會傳回(return)的目錄列表類型。此變數 (remote_fs) 與其它變數特別是 flags_recursive, recurse_hard 以及 get_size_change 之間有些交互作用。下列的節次將會秀些 在不同檔案服務處執行 ftp 的 dir 指令所產生的結果以及相關 變數的建議。在配合某些設定與衆不同的檔案服務處的時候你可能 必須變更此處所建議的變數設定。
remote_fs=unix total 65 -rw-r--r-- 1 ukuug ukuug 2245 Jun 28 20:06 README -rw-r--r-- 1 ukuug ukuug 61949 Jun 29 19:13 mirror-2.1.tar.gz
這是預設值而且你應該不必重設任何其它變數。
remote_fs=dls 00index.txt 189916 0readme 5793 1_x/ = OS/2 1.x-specific files
這是某些 unix 檔案服務處所使用的 ls 變化型。它在列表中提供 其所知項目的描述。把 flags_recursive 設爲 -dtR 即可。
remote_fs=netware - [R----F--] jrd 1646 May 07 21:43 index d [R----F--] jrd 512 Sep 09 10:52 netwire d [R----F--] jrd 512 Sep 02 01:31 pktdrvr d [RWCE-F--] jrd 512 Sep 04 10:55 incoming
這是 Novell 檔案服務處所使用的。把 recurse_hard 設爲 true 並且把 flags_recursive 設爲空(nothing)的。參閱 remote_dir
dosftp 00-index.txt 6,471 13:54 7/20/93 alabama.txt 1,246 23:29 5/08/92 alaska.txt 873 23:29 5/08/92 alberta.txt 2,162 23:29 5/08/92
dosftp 是在 dos 上執行的一套 ftp 伺服程式。recurse_hard 設爲 true 並且把 flags_recursive 設爲空(nothing)的。
remote_fs=macos -------r-- 0 127 127 Aug 27 13:53 !Gopher Links drwxrwxr-x folder 32 Sep 9 16:30 FAQ drwxrwx-wx folder 0 Sep 9 09:59 incoming
macos 是麥金塔(Macintosh) ftp 伺服程式的一個變化型。雖然此 輸出類似於 unix 但是 unix 這個 remote_fs 型態無法應付它是 因爲每個檔案有三個大小。把 recurse_hard 設爲 true, flags_ recursive 設爲空(nothing)的,get_size_change 設爲 false 並 將 compress_patt 設爲空(最後這個設定是因爲此不平常的檔案 名稱會擾亂執行壓縮的 shell 界面)。參閱 remote_dir 設定。
remote_fs=vms USERS:[ANONYMOUS.PUBLIC] 1-README.FIRST;13 9 14-JUN-1993 13:09 [ANONYMOUS] (RWE,RWE,RE,RE) PALTER.DIR;1 1 18-JAN-1993 11:56 [ANONYMOUS] (RWE,RWE,RE,RE) PRESS-RELEASES.DIR;1 1 11-AUG-1992 20:05 [ANONYMOUS] (RWE,RWE,,)
alternatively:
[VMSSERV.FILES]ALARM.DIR;1 1/3 5-MAR-1993 18:09 [VMSSERV.FILES]ALARM.TXT;1 1/3 4-FEB-1993 12:20
把 flags_recursive 設爲 '[...]' 並將 get_size_change 設爲 false。recurse_hard 在 vms 上不能使用。除此之外還可以參閱 vms_keep_version 以及 vms_xfer_text 變數。
這裏是從 src.doc.ic.ac.uk 上來的 mirror.defaults 檔案:
# This is the default mirror settings used by my site: # src.doc.ic.ac.uk (146.169.2.1) # This is home of the UKUUG Software Distribution Service package=defaults # The LOCAL hostname - if not the same as `hostname` # (I advertise the name src.doc.ic.ac.uk but the machine is # really puffin.doc.ic.ac.uk) hostname=src.doc.ic.ac.uk # Keep all local_dirs relative to here local_dir=/public/ remote_password=ukuug-soft@doc.ic.ac.uk mail_to= # Don't mirror file modes. Set all dirs/files to these dir_mode=0755 file_mode=0444 # By default, files are owned by root.zero user=0 group=0 # # Keep a log file in each updated directory # update_log=.mirror update_log= # Don't overwrite my mirror log with the remote one. # Don't retrieve any of their mirror temporary files. # Don't touch anything whose name begins with a space! # nor any FSP or gopher files... exclude_patt=(^|/)(.mirror$|.in..*.$|MIRROR.LOG|#.*#|.FSP|.c ache|.zipped|lost+found/| ) # Try to compress everything compress_patt=. compress_prog=compress # Don't compress information files, files that don't benefit from # being compressed, files that tell ftpd, gopher, wais... to do things, # the sources for compression programs... # (Note this is the only regexp that is case insensitive.) compress_excl+|^.notar$|-z|.taz$|.tar.Z|.arc$|.zip$|.lzh$|.z oo$|.exe$|.lha$|.zom$|.gif$|.jpeg$|.jpg$|.mpeg$|.au$|read.*me|index|.message|in fo|faq|gzip|compress # Don't delete own mirror log or any .notar files (incl in s ubdirs) delete_excl=(^|/).(mirror|notar)$ # Ignore any local readme files local_ignore=README.doc.ic # Automatically delete local copies of files that the # remote site has zapped do_deletes=trueHere are some sample package descriptions:
package=gnu comment=Powerful and free Un*x utilities site=prep.ai.mit.edu remote_dir=/pub/gnu # Local_dir+ causes gnu to be appended to the default local_ dir # so making /public/gnu local_dir+gnu exclude_patt+|^ListArchives/|^lost+found/|^scheme-7.0/|^.his tory # I tend to only keep the latest couple of versions of thing s # this stops mirror from retrieving the older versions I've removed max_days=30 do_deletes=false package=X11R5 comment=X Windows (windowing graphics system for Un*x) site=export.lcs.mit.edu remote_dir=/pub/R5 local_dir+computing/graphics/systems/X11/pub/R5 # This is a local symlink to the free-for-all contrib area # and is mirrored elsewhere local_ignore=^contrib$ # Don't compress a thing. It is already compressed # but doesn't look it. compress_patt= package=cnews comment=The C News system site=ftp.cs.toronto.edu remote_dir=/pub/c-news local_dir+computing/usenet/software/transport/c compress_excl+|patches/PATCHDATES|WhereFrom # THIS IS JUST A TEST package=test vms site site=vmsbox.somewhere.ac.uk local_dir=/tmp/copy4 remote_dir=vmsserv/files remote_fs=vms # Must do these settings for VMS flags_recursive=[...] get_size_change=false # and on, and on ...
要增加一個新的檔案包裹,首先打開 -n 選項檢查它。
如果你要增加到一個已經存在檔案的地方,那麼通常最好是 force 本地已經存在的檔案時間符合遠端的這樣將會執行與遠端檔案之間 的時間比較。
嘗試並將所有從相同節點擷取的檔案包裹放在一起。使用這種方式 的話 mirror 將僅需簽入一次。
記得所有的正規表示式都是 Perl 正規表示式。
如果遠端節點包含你想展開("flatten out") 到相對應檔案的符號 鏈結,那麼以改變傳送給遠端 ls 旗標的方式執行之。
flags_recursive+L或是
flags_nonrecursive+L首先以在遠端節點的 ftp 指令下嘗試 ls -lRatL 的方式來測試 遠端檔案服務處是否有任何符號鏈結迴圈。
如果你正要映射一個非常大而不常改變的節點,等它初次映射後在 設定中加上 max_days=7 選項。以此方式 mirror 在更新的時候僅 需要注意最近的檔案。然後每個禮拜一次,或者是有必要的時候, 以 -kmax_days=-0 呼叫 mirror 強制執行一次完整的更新。
如果你不想壓縮從遠端節點取得的任何東西則最簡單的方法就是將 compress_patt 設爲空(nothing) 的。
如果你想在映射一份檔案包裹後執行某個指令那麼有個有用的技巧 是將 mail_prog 變數重設爲程式的名稱並將 mail_to 重設爲其 參數。
對於 netware, dosftp, macos 以及 vms 而言一般你應該得要把 remote_dir 設爲遠端 ftp 伺服程式的 home 目錄。手動連線並 在切換到子目錄之前使用 pwd 指令找出 home 在哪裏。如果你僅 想要映射整個檔案樹的一部份那麼應該在開頭處給定包含此 home 目錄的完整路徑名稱。
macos 的名稱有時候會包含一些很難讓它們通過 un*x shells 的 字元。因爲檔案壓縮是經由 shell 執行最好設 compress_patt= 以便關閉壓縮。
macos 檔案在傳輸時似乎無論如何其大小都會改變,不管是以二進 位或是文字模式。所以最好是設 get_size_change=false 較佳。
如果你要映射一個遠端節點,請遵守該節點管理者對於存取開節點 所設的限制。你通常可以使用標準的 ftp 指令連到該檔案服務處 。任何限制一般會作爲簽入時的標題或是放在一個(希望是)明顯 的檔案裏。
這裏是,我希望是,一些好的一般原則:
只在本地以及遠端節點的工作時間以外映射節點。
嘗試每天映射一個遠端節點超過一次可能是不友善的。
在映射一個遠端節點之前,嘗試先從當地的檔案服務處尋找該檔案 包裹,因爲沒有人會高興你沒有必要地佔用許多網路頻寬。
如果你有一個當地的檔案服務處,那麼請告訴別人它的存在讓他們 不必量費頻寬以及 CPU 在遠端節點上。
要記得在遠端節點改變其存取限制時檢查你的配置檔。
定期檢查遠端節點是否有新的限制。
某些網路觀念指引應該要強調。
應該要能夠如同符號鏈結一般地應付鏈結。
Suffers from creeping featurism.
在 mirror 裏的物件比你所想的還要近!
Written by Lee McLoughlin . It uses an extended version of the ftp.pl package originally by: Alan R. Martello which uses the chat2.pl pack- age by: Randal L. Schwartz
Special thanks to the following people for patches, com- ments and other suggestions that have helped to improve mirror. If I have omitted anyone, please contact me.
James Revell Chris Myers Amos Shapira Paul A Vixie Jonathan Kamens Christian Andretzky Kean Stump Anita Eijs Simon E Sperro Aaron Wohl Michael Meissner Michael Graff Bradley Rhoades Edwards Reed Joachim Schrod David Woodgate Pieter Immelman Jost Krieger
Copyright (C) 1999 《Best Linux》. All rights reserved. Revised: 99-11-28.
軟件教程
最新的版本是mirror-2.9.7(20031118) 因此您手上這份1996年的原始文檔+1999年的翻譯也許不能滿足您的要求了。請登錄 http://sunsite.org.uk/packages/mirror/mirror.html 來參看原文。
2001/01/01
http://cmpp.linuxforum.net
本頁面中文版由中文
man 手冊頁計劃提供。
中文 man
手冊頁計劃:https://github.com/man-pages-zh/manpages-zh