自 Apache Ant 1.6 起
将文件或文件集复制到或从运行 SSH 守护程序的(远程)机器。文件集 *仅* 用于将文件从本地机器复制到远程机器。
注意:此任务依赖于 Ant 分发版中未包含的外部库。有关更多信息,请参见 库依赖项。此任务已使用 jsch-0.1.2
及更高版本进行测试。
另请参见 sshexec 任务
属性 | 描述 | 必需 |
---|---|---|
file | 要复制的文件。这可以是本地路径或远程路径,格式为 user[:password]@host:/directory/path。如果使用基于密钥的身份验证或指定 password 属性,则可以省略 :password。远程路径的识别方式是它是否包含 @字符。如果您的 localPath 包含 @字符,则此方法将不起作用。 |
是,除非使用嵌套的 <fileset> 元素 |
localFile | 这是 file 属性的替代方法。但此属性必须始终指向本地文件。添加此属性的原因是,当您提供 file 属性时,如果它包含 @字符,则将其视为远程文件。此字符也可能存在于本地路径中。自 Ant 1.6.2 起 |
替代 file 属性 |
remoteFile | 这是 file 属性的替代方法。但此属性必须始终指向远程文件。自 Ant 1.6.2 起 | 替代 file 属性 |
todir | 要复制到的目录。这可以是本地路径或远程路径,格式为 user[:password]@host:/directory/path。如果使用基于密钥的身份验证或指定 password 属性,则可以省略 :password。远程路径的识别方式是它是否包含 @字符。如果您的 localPath 包含 @字符,则此方法将不起作用。 |
是 |
localTodir | 这是 todir 属性的替代方法。但此属性必须始终指向本地目录。添加此属性的原因是,当您提供 todir 属性时,如果它包含 @字符,则将其视为远程文件。此字符也可能存在于本地路径中。自 Ant 1.6.2 起 |
替代 todir 属性 |
localTofile | 在接收文件时将文件名更改为给定名称,仅在接收单个文件时有用。自 Ant 1.6.2 起 | 替代 todir 属性 |
remoteTodir | 这是 todir 属性的替代方法。但此属性必须始终指向远程目录。自 Ant 1.6.2 起 | 替代 todir 属性 |
remoteTofile | 在发送文件时将文件名更改为给定名称,仅在发送单个文件时有用。自 Ant 1.6.2 起 | 替代 todir 属性 |
port | 要连接到远程主机上的端口。 | 否;默认为 22 |
trust | 如果设置为 yes或 true,则信任所有未知主机。 注意:如果将其设置为 false(默认值),则您连接到的主机必须列在您的 knownhosts 文件中,这也意味着该文件存在。 |
否;默认为 no |
knownhosts | 这将设置用于验证远程主机身份的已知主机文件。这必须是 SSH2 格式文件。不支持 SSH1 格式。 | 否;默认为 ${user.home}/.ssh/known_hosts |
failonerror | 如果传输失败,是否停止构建。 | 否;默认为 true |
password | 密码。 | 是,除非您使用基于密钥的身份验证或密码已在 file 或 todir 属性中给出 |
keyfile | 保存私钥的文件位置。 | 是,如果您使用基于密钥的身份验证 |
passphrase | 私钥的密码短语。 | 否;默认为空字符串 |
sshConfig | 保存 OpenSSH 样式配置的文件位置(例如 ${user.home}/.ssh/config )。用户名和密钥文件将从配置文件中读取,除非它们已在任务参数中指定。自 Ant 1.10.8 起 |
否 |
verbose | 确定 SCP 是否详细地输出给用户。目前,这意味着输出点/星号以显示文件传输的进度。自 Ant 1.6.2 起 | 否;默认为 false |
sftp | 确定 SCP 是否使用 sftp 协议。sftp 协议是 SSH2 的文件传输协议。如果要复制到/从不支持 scp1 的服务器,建议将其设置为 true。自 Ant 1.7 起 |
否;默认为 false |
preserveLastModified | 确定是否保留下载文件的最后修改时间戳。它仅在从远程系统传输到本地系统时有效,并且可能不适用于不支持 SSH2 的服务器。自 Ant 1.8.0 起 | 否;默认为 false |
filemode | 一个 3 位八进制字符串,以标准 Unix 方式指定用户、组和其他模式。仅适用于上传的文件。请注意,远程文件的实际权限将受此设置和远程服务器上的 UMASK 控制。自 Ant 1.9.5 起。 |
否;默认为 644 |
dirmode | 一个 3 位八进制字符串,以标准 Unix 方式指定用户、组和其他模式。仅适用于上传的目录。请注意,远程目录的实际权限将受此设置和远程服务器上的 UMASK 控制。自 Ant 1.9.5 起。 |
否;默认为 755 |
serverAliveIntervalSeconds | 设置一个超时间隔(以秒为单位),如果在此间隔内未从服务器收到数据,则任务将通过加密通道发送消息以请求服务器响应。自 Ant 1.9.7 起 | 否,默认为 0,表示不会将这些消息发送到服务器 |
serverAliveCountMax | 在未从服务器收到任何消息的情况下,可以发送的服务器活动消息的数量。仅在 serverAliveIntervalSeconds 不为 0时使用。自 Ant 1.9.7 起 |
否;默认为 3 |
compressed | 是否在传输期间启用压缩。自 Ant 1.9.8 起 | 否;默认为 false |
FileSet 或其他 资源集合 用于选择要复制的文件组。要使用文件集或资源集合,必须设置 todir 属性。
在 Ant 1.9.7 之前,仅支持 <fileset>
作为嵌套元素。
自 Ant 1.10.10 起
为创建的 JSch 会话添加配置设置,这些设置不受特定 Ant 属性的直接支持。
属性 | 描述 | 必需 |
---|---|---|
key | 配置设置的键。 | 是 |
value | 配置设置的值。 | 是 |
将单个本地文件复制到远程机器
<scp file="myfile.txt" todir="user:password@somehost:/home/chuck"/>
使用单独的 password 属性将单个本地文件复制到远程机器
<scp file="myfile.txt" todir="user@somehost:/home/chuck" password="password"/>
使用基于密钥的身份验证将单个本地文件复制到远程机器
<scp file="myfile.txt" todir="user@somehost:/home/chuck" keyfile="${user.home}/.ssh/id_dsa" passphrase="my extremely secret passphrase"/>
将单个远程文件复制到本地目录
<scp file="user:password@somehost:/home/chuck/myfile.txt" todir="../some/other/dir"/>
将远程目录复制到本地目录
<scp file="user:password@somehost:/home/chuck/*" todir="/home/sara"/>
将本地目录复制到远程目录
<scp todir="user:password@somehost:/home/chuck/"> <fileset dir="src_dir"/> </scp>
将一组文件复制到目录
<scp todir="user:password@somehost:/home/chuck"> <fileset dir="src_dir"> <include name="**/*.java"/> </fileset> </scp>
以相反的最后修改顺序将一组文件复制到远程目录
<scp todir="user:password@somehost:/home/chuck"> <sort> <reverse> <date/> </reverse> <fileset dir="src_dir"> <include name="**/*"/> </fileset> </sort> </scp>
安全注意事项:在 scp
任务中硬编码密码和/或用户名可能是一个严重的漏洞。考虑使用变量替换,并在命令行中包含密码。例如
<scp todir="${username}:${password}@host:/dir" ...>
使用以下命令行调用 Ant
ant -Dusername=me -Dpassword=mypassword target1 target2
稍微好一些,但用户名/密码会暴露给 Unix 系统上的所有用户(通过 ps 命令)。最佳方法是使用 <input>
任务和/或从(安全的).properties 文件中检索密码。
Unix 说明:下载文件时不会保留文件权限;它们最终会使用默认的 UMASK
权限。这是由于当前 Java 运行时缺少查询或设置文件权限的任何方法。如果您需要一个保留权限的复制功能,请改用 <exec executable="scp" ... >
。