FTP

描述

ftp 任务实现了一个基本的 FTP 客户端,可以发送、接收、列出、删除文件以及创建目录。请参见以下内容,了解如何执行每个任务的描述和示例。

注意:此任务依赖于 Apache Ant 分发版中未包含的外部库。有关更多信息,请参见 库依赖项获取此库的最新版本,以获得 Ant 中的最佳支持。

ftp 任务尝试确定 FTP 服务器上存在的文件系统。支持的服务器类型包括 Unix、NT、OS2、VMS 和 OS400。此外,已配置为以 Unix 样式显示目录的 NT 和 OS400 服务器也得到正确支持。否则,系统将默认使用 Unix 标准。remotedir 必须以 FTP 服务器所需的精确语法指定。如果服务器不支持通常的 Unix 约定,则可以使用 separator 来设置应使用的文件分隔符。

有关如何包含/排除文件以及如何编写模式的信息,请参见有关 基于目录的任务 的部分。

此任务当前不使用由 <setproxy> 任务设置的代理信息,并且无法通过 socks 穿越防火墙。

警告:据报道,ftpget 操作与 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 服务器上的远程目录,请参见下表以了解详细用法
action 要执行的 FTP 操作。当前支持 putgetdellistchmodmkdirrmdirsite 否;默认值为 send
binary 选择二进制模式 (yes) 或文本模式 (no) 传输。 否;默认值为 yes
passive 选择被动模式 (yes) 传输,以实现更好的防火墙连接,但性能会降低。 否;默认值为 no
verbose 如果设置为 yes,则显示每个传输文件的详细信息。 否;默认值为 no
depends 如果设置为 yes,则仅传输新文件或已更改文件。 否;默认值为 no
newer depends 的同义词。请参见 timediffautotimediffmillis
timediffauto 设置为 true 以使 Ant 计算客户端和服务器之间的时间差。
需要远程目录中的写入权限
自 Ant 1.6 起
如果设置为 true,则 Ant 将在 临时目录 中创建一个空文件,并将其传输到远程服务器 - 在确定时间差后,将删除两侧的文件。
timestampGranularity 指定 MINUTENONE(您可以指定 ,这等效于未指定值,对于属性文件驱动的脚本很有用)。允许覆盖 putget 中的典型情况,其中本地文件系统的 timestamps 为 HH:mm:ss,而典型 FTP 服务器的 timestamps 为 HH:mm。这可能会影响 uptodate 计算。但是,默认值应该足以满足大多数应用程序。
自 Ant 1.7 起
否;仅适用于 put(默认值为 MINUTE)和 get(默认值为 NONE;没有必要,因为我们有 preservelastmodified 选项)
timediffmillis 已弃用。要添加到远程计算机上的时间以获得本地计算机上的时间的时间(以毫秒为单位)。timestampGranularity 属性(其默认值应该足以满足大多数情况)和 serverTimeZoneConfig 选项应该使此操作变得不必要。serverTimeZoneConfig 会为您执行数学运算,并且还了解夏令时。
自 Ant 1.6 起
separator 设置 FTP 服务器上使用的文件分隔符。 否;默认值为 /
umask 设置新文件的默认文件权限,仅限 Unix。
chmod 设置或更改新文件或现有文件的权限,仅限 Unix。如果与 put 操作一起使用,则将针对每个文件发出 chmod
listing 用于写入 list 操作结果的文件。 是,对于 list 操作;否则忽略
ignoreNoncriticalErrors 标志,允许任务忽略某些服务器在创建目录期间发送的非致命错误代码:特别是 wu-ftp。 否;默认值为 false
skipFailedTransfers 标志,允许跳过不成功的文件 putdeleteget 操作,并显示警告,同时仍然传输其余文件。 否;默认值为 false
preservelastmodified 使复制的文件具有与原始源文件相同的最后修改时间(仅适用于获取文件)。 否;默认值为 false
retriesAllowed 设置文件传输操作允许的重试次数。如果指定了正数,则每个文件传输最多可以失败该次数,然后操作才会失败。如果指定了 -1forever,则操作将一直尝试,直到成功。 否;默认值为 0
siteCommand 如果 action 属性已指定为 site,则设置要执行的特定于服务器的 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)指定服务器用于 timestamps 的时区。这使得即使服务器与客户端位于不同的时区,也能进行时间戳依赖项检查。时区还了解夏令时,并且不需要您计算毫秒差。如果未指定(或指定为 ),则假设为客户端的时区。
自 Ant 1.7 起
defaultDateFormatConfig 以 Java SimpleDateFormat 符号(例如 yyyy-MM-dd)指定 FTP 服务器通常用于解析日期的日期格式。在某些情况下,这将是唯一使用的日期格式。在其他情况下(例如 unix),这将用于超过一年的日期。(请参见 recentDateFormatConfig)。当指定为 时,将使用默认值。
自 Ant 1.7 起
否;默认值为由 systemTypeKey 指示的系统类型的默认日期格式
recentDateFormatConfig 以 Java SimpleDateFormat 符号(例如 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 检索文件的基目录 位于 remotedir 下的远程文件,与 fileset 的包含/排除模式匹配
del/delete 删除文件的基目录 位于 remotedir 下的远程文件,与 fileset 的包含/排除模式匹配
list 列出文件的基目录 位于 remotedir 下的远程文件,与 fileset 的包含/排除模式匹配
mkdir 要创建的目录 未使用
chmod 更改文件模式的基目录 位于 remotedir 下的远程文件,与 fileset 的包含/排除模式匹配
rmdir 删除目录的基目录 位于 remotedir 下的远程目录,与 fileset 的包含/排除模式匹配

作为嵌套元素指定的参数

fileset

ftp 任务支持任意数量的嵌套 <fileset> 元素,以指定要检索、删除、列出或更改其模式的文件。

fileset 的属性 followsymlinks 在本地 (put) 和远程 (getchmoddeletelist) 文件集中都受支持。在 Ant 1.6 之前,远程文件集不支持符号链接。为了排除符号链接(保留 Ant 1.5.x 及更早版本的行为),您需要显式地将 followsymlinks 设置为 false在远程文件集中,不会检查隐藏文件是否为符号链接。目前假设隐藏文件不是符号链接。

发送文件

描述如何发送文件的最佳方法是使用几个示例。

anonymous 用户身份登录 ftp.apache.org,并将 htdocs/manual 目录中的所有文件上传到该用户的默认目录。

<ftp server="ftp.apache.org"
     userid="anonymous"
     password="[email protected]">
    <fileset dir="htdocs/manual"/>
</ftp>

anonymous 用户身份登录 ftp.apache.org,并将 htdocs/manual 目录中所有新文件或已更改文件上传到相对于 anonymous 用户默认目录的 incoming 目录。

<ftp server="ftp.apache.org"
     remotedir="incoming"
     userid="anonymous"
     password="[email protected]"
     depends="yes">
    <fileset dir="htdocs/manual"/>
</ftp>

coder 用户身份登录 ftp.apache.org,端口为 2121,密码为 java1,并将 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 用户身份登录位于 ftp.hypothetical.india.org 的 Windows 服务器,端口为 2121,密码为 java1,并将 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 用户身份登录基于 Windows 的 ftp.nt.org,密码为 java1,并将 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="[email protected]">
    <fileset dir="htdocs/manual">
        <include name="**/*.html"/>
    </fileset>
</ftp>

如果 apache.org 曾经切换到使用新的全数字格式的时间戳的 Unix FTP 服务器,则此版本将变得必要。它将完成与前一个示例相同的功能,但能够成功处理数字时间戳。这里不需要 systemTypeKey,但它有助于澄清正在发生的事情。

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

anonymous 用户身份登录位于 ftp.hypothetical.fr 的 UNIX FTP 服务器,该服务器以标准欧洲格式使用法语名称显示日期,并递归地将该用户默认目录中的所有 .html 文件下载到本地机器上的 htdocs/manual 目录。

<ftp action="get"
     server="ftp.hypthetical.fr"
     userid="anonymous"
     password="[email protected]"
     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="[email protected]">
    <fileset>
        <include name="**/*.tmp"/>
    </fileset>
</ftp>

列出文件

data/ftp.listing 中获取 FTP 服务器上相对于 anonymous 用户默认目录的所有文件的列表。列表以 FTP 服务器通常列出文件的任何格式显示。

<ftp action="list"
     server="ftp.apache.org"
     userid="anonymous"
     password="[email protected]"
     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="[email protected]"
     remotedir="some/remote/dir"/>

删除目录

此操作使用嵌套的文件集元素来选择要从远程 FTP 服务器中删除的目录。文件集相对于远程目录,而不是本地目录。文件集的 dir 属性将完全被忽略。要删除的目录必须为空,或者仅包含其他也已通过文件集模式选择要删除的目录,否则将抛出 BuildException。此外,如果您没有删除目录的权限,则会抛出 BuildException

anonymous 用户身份登录 ftp.apache.org,并尝试删除 /somedir/dira 目录和从 /somedir/dirb 开始并包括该目录的所有目录树。删除 /somedir/dirb 树时,任务从叶子开始向上移动到根,因此当它尝试删除目录时,它可以确保该目录下的所有目录都已删除。显然,树中的所有文件都必须已删除。

<ftp action="rmdir"
     server="ftp.apache.org"
     userid="anonymous"
     password="[email protected]"
     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/**