Ant: scp create directory if not exist

左心房为你撑大大i 提交于 2019-12-20 03:25:18

问题


I am using this to copy from A to B. But if for example the folder /config doesnt exist it gives me an exception. How can I solve it? I tried mkdirs="true" but it runs to error as well

<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>

回答1:


It's not possible to create remote directories with scp task. Here's a macrodef for scptransfer, that does all the work needed for transfer from a given stagedirectory => fix linefeeds, createremote, deleteremote, fail if stagedir empty ... etc. Macrodef is using ant addon Flaka, if you don't need all that bells and whistles, simply use sshexec task with mkdir -p before scp to create your remote 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> 

As we switched to Github only recently get the manual here and some examples here.




回答2:


You can use sshexec to create directories tree on remote machine before coping. mkdir -p creates directories if not exists. (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" />

Add it to your target before scp



来源:https://stackoverflow.com/questions/33477138/ant-scp-create-directory-if-not-exist

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!