FTP

說明

ftp 任務實作一個基本 FTP 伺服器,可以傳送、接收、列出、刪除檔案,以及建立目錄。請參閱下方各項任務的說明與範例。

注意:此任務仰賴 Apache Ant 發行版中未包含的外部函式庫。有關更多資訊,請參閱 函式庫相依性取得此函式庫的最新版本,以獲得 Ant 中最佳的支援。

ftp 任務會嘗試判斷 FTP 伺服器上有哪些檔案系統。支援的伺服器類型有 Unix、NT、OS2、VMS 和 OS400。此外,也正確支援已設定為以 Unix 樣式顯示目錄的 NT 和 OS400 伺服器。否則,系統會預設為 Unix 標準。remotedir 必須以 FTP 伺服器要求的確切語法指定。如果伺服器不支援一般的 Unix 慣例,可以使用 separator 設定應改用哪個檔案分隔符號。

請參閱 目錄基礎任務 一節,了解檔案的包含/排除運作方式,以及如何撰寫模式。

此任務目前不使用 <setproxy> 任務設定的代理資訊,也無法透過 socks 穿透防火牆。

警告:已報告有關 ftp get 搭配 newer 屬性的問題。問題可能是因為 ls -l 的格式與 commons-net 預期的不同,例如由於 FTP 伺服器在目錄清單中使用的語言特定性所致。如果您遇到此類問題,請寄送一封電子郵件,其中包含來自您的 FTP 伺服器(FTP 提示中的 ls -l)的範例目錄清單。

如果您能連線但無法上傳或下載,請嘗試將 passive 屬性設定為 true,以使用現有的(開放的)頻道,而不是讓伺服器嘗試設定新的連線。

參數

屬性 說明 必要
server 遠端 FTP 伺服器的位址。
port 遠端 FTP 伺服器的埠號。 否;預設為 21
userid 在 FTP 伺服器上使用的登入 ID。
password 在 FTP 伺服器上使用的登入密碼。
account 在 FTP 伺服器上使用的帳戶。自 Ant 1.7 起
remotedir FTP 伺服器上的遠端目錄,請參閱下表以了解詳細用法
動作 要執行的 FTP 動作。目前支援 putgetdellistchmodmkdirrmdirsite 否;預設為 send
二進位 選擇二進位模式 (yes) 或文字模式 (no) 傳輸。 否;預設為 yes
被動 選擇被動模式 (yes) 傳輸,以獲得更好的防火牆連線性,但會犧牲效能。 否;預設為 no
詳細 如果設定為 yes,會顯示每個傳輸檔案的資訊。 否;預設為 no
依賴 如果設定為 yes,只會傳輸新的或已變更的檔案。 否;預設為 no
較新 depends 的同義詞。請參閱 timediffautotimediffmillis
timediffauto 設定為 true,讓 Ant 計算用戶端和伺服器之間的時間差。
需要遠端目錄的寫入權限
自 Ant 1.6 起
如果設定為 true,Ant 會在 暫存目錄 中建立一個空檔案,並將它傳輸到遠端伺服器,在確定差異後,會在兩端刪除它。
timestampGranularity 指定 MINUTENONE(您可以指定等於未指定值的 ,這對於由屬性檔驅動的指令碼很有用)。允許在 putget 中覆寫典型情況,其中本機檔案系統的時間戳記為 HH:mm:ss,而典型的 FTP 伺服器時間戳記為 HH:mm。這可能會影響 uptodate 計算。不過,預設值應足以應付大多數應用程式。
自 Ant 1.7 起
否;只適用於 put(預設為 MINUTE)和 get(預設為 NONE;由於我們有 preservelastmodified 選項,因此沒有那麼必要)
timediffmillis 已棄用。要新增到遠端機器時間的毫秒數,以取得本機機器時間。timestampGranularity 屬性(其預設值在大多數情況下應已足夠),以及 serverTimeZoneConfig 選項,應讓這項設定變得不必要。serverTimeZoneConfig 會為您進行運算,而且也知道夏令時間。
自 Ant 1.6 起
分隔符號 設定 FTP 伺服器使用的檔案分隔符號。 否;預設為 /
umask 設定新檔案的預設檔案權限,僅限 Unix。
chmod 設定或變更新檔案或現有檔案的檔案權限,僅限 Unix。如果與 put 動作搭配使用,chmod 將針對每個檔案發出。
列出 寫入 list 動作結果的檔案。 是,針對 list 動作;否則忽略
ignoreNoncriticalErrors 旗標,允許任務忽略某些目錄建立期間由部分伺服器傳送的非致命錯誤碼:特別是 wu-ftp。 否;預設為 false
skipFailedTransfers 旗標,啟用不成功的檔案 putdeleteget 作業,並以警告略過,且其餘檔案仍會傳輸。 否;預設為 false
preservelastmodified 讓複製檔案的最後修改時間與原始來源檔案相同(僅適用於取得檔案)。 否;預設為 false
retriesAllowed 設定檔案傳輸作業允許的重試次數。如果指定正數,每個檔案傳輸可以在作業失敗前失敗這麼多次。如果指定 -1forever,作業將持續嘗試,直到成功為止。 否;預設為 0
siteCommand 設定伺服器特定的 SITE 指令,如果 action 屬性已指定為 site,則執行該指令。
initialSiteCommand 設定伺服器特定的 SITE 指令,在登入後立即執行。
enableRemoteVerification 是否應驗證資料連線以連接到與控制連線相同的主機。這是一項預設啟用的安全措施,但在某些防火牆場景中,停用它可能會很有用。自 Ant 1.8.0 起 否;預設為 true
dataTimeout 設定在資料連線上等待資料時使用的逾時時間(毫秒)。值 0 表示無限逾時。自 Ant 1.10.7 起
wakeUpTransferInterval 僅在證明有必要時使用,觸發 LIST 指令的秒數間隔,觸發資料連線(以避免 FTP 伺服器在沒有資料連線時逾時)。自 Ant 1.10.7 起

下列屬性需要 jakarta-commons-net-1.4.0 或更高版本

當標準選項無法運作時,請使用下列選項,因為

  • 伺服器位於不同的時區,而您需要時間戳記相依性檢查
  • 預設時間戳記格式與伺服器顯示不符,導致清單解析失敗

如果未指定任何一項,系統將使用預設機制,根據 FTP SYST 命令自動偵測伺服器作業系統類型,並假設該作業系統類型的標準格式。

為了協助以屬性檔為基礎的開發,其中建置指令碼已使用屬性檔進行組態,對於任何這些屬性, 值等同於未指定。

請了解這些選項與自動偵測機制不相容。如果指定任何這些選項( 值除外),則必須選擇系統類型,如果未指定 systemTypeKey,則假設為 UNIX。此背後的原因是,這些選項用於設定非標準格式,而了解自己處理哪個系統的建置指令碼作者將知道需要設定哪些選項。否則,應略過這些選項,並使用預設的自動偵測機制,這在大部分情況下都能運作。

systemTypeKey 指定伺服器上使用的系統類型。支援的值為 UNIXVMSWINDOWSOS/2OS/400MVS。如果未指定(或指定為 ),且未指定任何其他 xxxConfig 屬性,則將使用根據 FTP SYST 命令的自動偵測機制。
自 Ant 1.7 起
否,但如果指定下列任何 xxxConfig 屬性,則假設為 UNIX,即使在此處指定 也是如此。
serverTimeZoneConfig 指定為 Java TimeZone 識別碼(例如 GMTAmerica/ChicagoAsia/Jakarta),這是伺服器用於時間戳記的時區。即使伺服器與用戶端位於不同的時區,這也能啟用時間戳記相依性檢查。時區也知道夏令時間,而且不需要您計算毫秒差。如果未指定(或指定為 ),則假設為用戶端的時區。
自 Ant 1.7 起
defaultDateFormatConfig 使用 Java SimpleDateFormat 表示法(例如 yyyy-MM-dd)指定 FTP 伺服器通常用於解析日期的日期格式。在某些情況下,這將是唯一使用的日期格式。在其他情況下(例如 unix),這將用於超過一年的日期。(請參閱 recentDateFormatConfig)。當指定為 時,將使用預設值。
自 Ant 1.7 起
否;預設為 systemTypeKey 指出的系統類型的預設日期格式
recentDateFormatConfig SimpleDateFormat 符號在 Java 中指定(例如 MMM dd hh:mm),FTP 伺服器用於剖析一年以內日期的日期格式。如果未指定(或指定為 ),且 systemTypeKey 指示的系統類型使用最近的日期格式,則會使用其標準格式。
自 Ant 1.7 起
serverLanguageCodeConfig 用於指定伺服器用於格式化月份名稱的 兩個字母的 ISO-639 語言代碼。只有當伺服器在其日期清單中使用非數字縮寫表示月份且語言非英語時,才需要指定此項。這似乎越來越罕見,因為常見的 FTP 伺服器似乎越來越常使用英語或全數字格式。支援的語言包括
  • en—英文
  • fr—法文
  • de—德文
  • it—義大利文
  • es—西班牙文
  • pt—葡萄牙文
  • da—丹麥文
  • sv—瑞典文
  • no—挪威文
  • nl—荷蘭文
  • ro—羅馬尼亞文
  • sq—阿爾巴尼亞文
  • sh—塞爾維亞-克羅埃西亞文
  • sk—斯洛伐克文
  • sl—斯洛維尼亞文
如果您需要上述語言以外的語言,請參閱 shortMonthNamesConfig 屬性。
自 Ant 1.7 起
shortMonthNamesConfig 指定伺服器在檔案時間戳記日期中使用的月份縮寫,每個月份以直線分隔符號表示的字串。例如,假設的冰島 FTP 伺服器使用的月份名稱集合可能會指定為 jan|feb|mar|apr|maí|jún|júl|ágú|sep|okt|nóv|des。此屬性主要用於支援 serverLanguageCode 屬性不支援的語言。
自 Ant 1.7 起
useFtps 是否使用 ftps 取代 ftp。布林值,預設為 false
自 Ant 1.10.13 起

關於 remotedir 屬性的注意事項

動作 remotedir 的意義 使用巢狀 fileset 的方式
send/put 傳送檔案的基礎目錄 正常使用並在本地電腦上評估
recv/get 擷取檔案的基礎目錄 符合 fileset 包含/排除模式的 remotedir 下的遠端檔案
del/delete 刪除檔案的基礎目錄 符合 fileset 包含/排除模式的 remotedir 下的遠端檔案
list 列出檔案的基礎目錄 符合 fileset 包含/排除模式的 remotedir 下的遠端檔案
mkdir 要建立的目錄 未使用
chmod 變更檔案模式的基礎目錄 符合 fileset 包含/排除模式的 remotedir 下的遠端檔案
rmdir 移除目錄的基礎目錄 位於 remotedir 下符合 fileset 包含/排除模式的遠端目錄

指定為巢狀元素的參數

fileset

ftp 任務支援任意數量的巢狀 <fileset> 元素,以指定要擷取、刪除、列出或變更模式的檔案。

fileset 的屬性 followsymlinks 支援本機 (put) 和遠端 (getchmoddeletelist) fileset。在 Ant 1.6 之前,遠端 fileset 不支援符號連結。若要排除符號連結(保留 Ant 1.5.x 及更舊版本的行為),您需要明確將 followsymlinks 設為 false在遠端 fileset 中,不會檢查隱藏檔案是否為符號連結。目前假設隱藏檔案不是符號連結。

傳送檔案

描述如何傳送檔案最簡單的方法是舉幾個範例。

anonymous 身分登入 ftp.apache.org,並將 htdocs/manual 目錄中的所有檔案上傳到該使用者的預設目錄。

<ftp server="ftp.apache.org"
     userid="anonymous"
     password="me@myorg.com">
    <fileset dir="htdocs/manual"/>
</ftp>

anonymous 身分登入 ftp.apache.org,並將 htdocs/manual 目錄中所有新增或變更的檔案上傳到 anonymous 的預設目錄相對應的 incoming 目錄。

<ftp server="ftp.apache.org"
     remotedir="incoming"
     userid="anonymous"
     password="me@myorg.com"
     depends="yes">
    <fileset dir="htdocs/manual"/>
</ftp>

coder 身分使用密碼 java1 登入埠 2121 上的 ftp.apache.org,並將 htdocs/manual 目錄中所有新增或變更的 HTML 檔案上傳到 /pub/incoming 目錄。檔案以文字模式傳輸。已開啟被動模式,以便在防火牆後傳送檔案。

<ftp server="ftp.apache.org"
     port="2121"
     remotedir="/pub/incoming"
     userid="coder"
     password="java1"
     passive="yes"
     depends="yes"
     binary="no">
    <fileset dir="htdocs/manual">
        <include name="**/*.html"/>
    </fileset>
</ftp>

coder 身分使用密碼 java1 登入埠 2121 上的 Windows 伺服器 ftp.hypothetical.india.org,並將 htdocs/manual 目錄中所有新增或變更(考量時區差異)的 HTML 檔案上傳到 /pub/incoming 目錄。檔案以文字模式傳輸。

<ftp server="ftp.hypothetical.india.org"
     port="2121"
     remotedir="/pub/incoming"
     userid="coder"
     password="java1"
     depends="yes"
     binary="no"
     systemTypeKey="Windows"
     serverTimeZoneConfig="India/Calcutta">
    <fileset dir="htdocs/manual">
        <include name="**/*.html"/>
    </fileset>
</ftp>

coder 使用密碼 java1 登入 Windows-based ftp.nt.org,並將 htdocs/manual 目錄中的所有 HTML 檔案上傳至 c:\uploads 目錄。上傳每個檔案時,進度訊息會顯示。

<ftp server="ftp.nt.org"
     remotedir="c:\uploads"
     userid="coder"
     password="java1"
     separator="\"
     verbose="yes">
    <fileset dir="htdocs/manual">
        <include name="**/*.html"/>
    </fileset>
</ftp>

取得檔案

從 FTP 伺服器取得檔案的方式與傳送檔案的方式大致相同。唯一的差異在於,巢狀檔案集使用 remotedir 屬性作為 FTP 伺服器上檔案的基礎目錄,並使用 dir 屬性作為將檔案放入的本機目錄。FTP 網站的檔案結構會保留在本地端機器上。

anonymous 登入 ftp.apache.org,並遞迴下載該使用者預設目錄中的所有 .html 檔案至本地端機器上的 htdocs/manual 目錄。

<ftp action="get"
     server="ftp.apache.org"
     userid="anonymous"
     password="me@myorg.com">
    <fileset dir="htdocs/manual">
        <include name="**/*.html"/>
    </fileset>
</ftp>

如果 apache.org 曾經切換至使用新全數字格式時間戳記的 Unix FTP 伺服器,則此版本將變得必要。它將完成與前一個範例相同的功能,但會成功處理數字時間戳記。systemTypeKey 在這裡並非必要,但有助於釐清發生了什麼事。

<ftp action="get"
     server="ftp.apache.org"
     userid="anonymous"
     password="me@myorg.com"
     systemTypeKey="UNIX"
     defaultDateFormatConfig="yyyy-MM-dd HH:mm">
    <fileset dir="htdocs/manual">
        <include name="**/*.html"/>
    </fileset>
</ftp>

anonymous 登入顯示日期為標準歐洲格式的法文名稱的 UNIX FTP 伺服器 ftp.hypothetical.fr,並遞迴下載該使用者預設目錄中的所有 .html 檔案至本地端機器上的 htdocs/manual 目錄。

<ftp action="get"
     server="ftp.hypthetical.fr"
     userid="anonymous"
     password="me@myorg.com"
     defaultDateFormatConfig="d MMM yyyy"
     recentDateFormatConfig="d MMM HH:mm"
     serverLanguageCodeConfig="fr">
    <fileset dir="htdocs/manual">
        <include name="**/*.html"/>
    </fileset>
</ftp>

刪除檔案

您現在可能已經猜到了,您使用巢狀檔案集元素來選取要從遠端 FTP 伺服器刪除的檔案。同樣地,檔案集是相對於遠端目錄,而不是本機目錄。事實上,檔案集的 dir 屬性會被完全忽略。

anonymous 登入 ftp.apache.org,並嘗試從該使用者的預設目錄中刪除所有 *.tmp 檔案。如果您沒有刪除檔案的權限,則會擲回 BuildException

<ftp action="del"
     server="ftp.apache.org"
     userid="anonymous"
     password="me@myorg.com">
    <fileset>
        <include name="**/*.tmp"/>
    </fileset>
</ftp>

列出檔案

取得 anonymous 使用者的預設目錄中所有 FTP 伺服器檔案的檔案清單,並儲存在 data/ftp.listing 中。清單格式為 FTP 伺服器通常列出檔案的格式。

<ftp action="list"
     server="ftp.apache.org"
     userid="anonymous"
     password="me@myorg.com"
     listing="data/ftp.listing">
    <fileset>
        <include name="**"/>
    </fileset>
</ftp>

建立目錄

請注意,對於 mkdir 動作,要建立的目錄是使用 remotedir 屬性指定的。

在預設根目錄下建立目錄 some/remote/dir。與所有其他動作一樣,目錄分隔字元必須根據 FTP 伺服器的需求正確。

<ftp action="mkdir"
     server="ftp.apache.org"
     userid="anonymous"
     password="me@myorg.com"
     remotedir="some/remote/dir"/>

移除目錄

此動作使用巢狀 fileset 元素來選取要從遠端 FTP 伺服器移除的目錄。fileset 是相對於遠端目錄,而不是本機目錄。dir fileset 的屬性會被完全忽略。要移除的目錄必須是空的,或只包含其他也已選取要由 fileset 模式移除的目錄,否則會擲回 BuildException。此外,如果您沒有權限移除目錄,也會擲回 BuildException

anonymous 身分登入 ftp.apache.org,並嘗試移除 /somedir/dira 目錄和從 /somedir/dirb 開始(包含)的所有目錄樹。在移除 /somedir/dirb 樹時,此工作會從樹葉開始移至根目錄,如此一來,當它嘗試移除目錄時,可以確定其下的所有目錄都已移除。顯然樹中的所有檔案都必須已刪除。

<ftp action="rmdir"
     server="ftp.apache.org"
     userid="anonymous"
     password="me@myorg.com"
     remotedir="/somedir" >
    <fileset>
        <include name="dira"/>
        <include name="dirb/**"/>
    </fileset>
</ftp>

舉例來說,假設您想要刪除 /somedir 中包含的所有內容,因此先呼叫 action=delete<ftp> 工作,然後呼叫 action=rmdir,並在兩種情況下指定 remotedir=/somedir

<fileset>
    <include name="**"/>
</fileset>

remotedir 參數中指定的目錄永遠不會選取為移除,因此如果您需要移除它,請在 remotedir 參數中指定其父目錄,並將其包含在 <fileset> 模式中,例如 somedir/**