我用这个从A复制到B. 但是,如果例如文件夹/配置不存在,它会给我一个例外。我该如何解决?我试过mkdirs =" true"但它也会运行错误
<scp todir="${ftplogin}@${ftpserver}:${ftp-remote-dir}/config" verbose="false" trust="true" failonerror="No">
<fileset dir="${stuff}/${stuff-version}/config${config-files}">
<include name="*.*"/>
</fileset>
</scp>
答案 0 :(得分:2)
您可以在应对之前使用sshexec在远程计算机上创建目录树。 mkdir -p创建目录(如果不存在)。 (How to mkdir only if a dir does not already exist?)
<sshexec
host="${host}"
username="${remote_user}"
password="${remote_password}"
command="mkdir -p ${remote_dir_path}"
trust="true" />
在scp
之前将其添加到目标答案 1 :(得分:0)
无法使用scp任务创建远程目录。
这是scptransfer的一个macrodef,它完成了传输所需的所有工作
来自给定的stagedirectory =&gt;修复换行,createremote,deleteremote,如果stagedir为空则失败...等。
Macrodef正在使用ant addon Flaka,如果你不需要所有的花里胡哨,只需使用sshexec task和mkdir -p
在scp之前创建远程targetdir。
<project xmlns:fl="antlib:it.haefelinger.flaka">
<fl:install-property-handler/>
<macrodef name="scptransfer">
<attribute name="host" default="${aix.host}"/>
<attribute name="userid" default="${aix.userid}"/>
<attribute name="knownhosts" default="${aix.knownhosts}"/>
<attribute name="ppk" default="${aix.ppk}"/>
<attribute name="createremote" default="false"/>
<attribute name="remotedir" default="${eartarget}/${project}/${env}/${module}/${job.id}"/>
<attribute name="deleteremote" default="false"/>
<attribute name="deleteincludes" default="*"/>
<attribute name="stagedir" default="${artifactdir}/${module}"/>
<attribute name="stageincludes" default="**/*.*"/>
<attribute name="stageexcludes" default=""/>
<attribute name="failstageempty" default="true"/>
<attribute name="fixLF" default="false"/>
<attribute name="timeout" default="900000"/>
<attribute name="verbose" default="true"/>
<sequential>
<echo>
=============== SCP Transfer ===============
Project = ${project}
Environment = ${env}
UserID = @{userid}
Targetserver = @{host}
Targetpath = @{remotedir}
fixLF ? = @{fixLF}
createremote ? = @{createremote}
deleteremote ? = @{deleteremote}
#{@{deleteremote} ? 'deleteincludes = @{deletecincludes}' : '' }
Stagedir = @{stagedir}
stageincludes = @{stageincludes}
stageexcludes = @{stageexcludes}
=============== SCP Transfer ===============
</echo>
<!-- contents in stagedir ? -->
<resourcecount property="stagecount">
<fileset dir="@{stagedir}" includes="@{stageincludes}" excludes="@{stageexcludes}" id="stagecontents"/>
</resourcecount>
<fl:choose>
<fl:when test=" ${stagecount} > 0 ">
<!-- Fix Linefeeds for ASCII Files -->
<fl:when test=" @{fixLF} ">
<fixcrlf
excludes="**/*.jar **/*.tar **/*.zip **/*.ear **/*.class"
srcdir="@{stagedir}"
eol="lf"
eof="remove"
fixlast="true"
/>
</fl:when>
<!-- // T i m e o u t -->
<parallel threadcount="1" timeout="@{timeout}">
<!-- create remotedir ? -->
<fl:when test=" @{createremote} ">
<sshexec host="@{host}"
username="@{userid}"
knownhosts="@{knownhosts}"
keyfile="@{ppk}"
command="mkdir -p @{remotedir}"
/>
</fl:when>
<!-- delete contents in remotedir ?
will throw error if remotedir doesn't exist ! -->
<fl:when test=" @{deleteremote} ">
<sshexec host="@{host}"
username="@{userid}"
knownhosts="@{knownhosts}"
keyfile="@{ppk}"
command="cd @{remotedir};rm -rfe @{delfilepattern}"
/>
</fl:when>
<!-- Filetransfer from stagedir -->
<scp todir="@{userid}@@@{host}:@{remotedir}"
keyfile="@{ppk}"
knownhosts="@{knownhosts}"
sftp="true"
verbose="@{verbose}"
>
<fileset refid="stagecontents"/>
</scp>
</parallel>
<!-- T i m e o u t // -->
</fl:when>
<fl:otherwise>
<echo>
=============== SCP Transfer =============
Skip => NO StageDirContents !!
=============== SCP Transfer =============
</echo>
<fl:fail message="Stagedir [@{stagedir}] empty !!" test=" @{failstageempty} "/>
</fl:otherwise>
</fl:choose>
</sequential>
</macrodef>
</project>