如何使用 ant 将文件从 Unix 共享复制到 Windows 机器?

How to copy files from a Unix share to a Windows machine using ant?

我在 Unix 机器上有一些文件,我可以使用 \host\directory

通过 Windows Explorer 从我的 Windows PC 访问这些文件

但是使用ant复制任务时,ant一直说目录不存在...

所以,蚂蚁部分是:

<if>
    <available file="${unix-dbs-dir}" type="dir" />
    <then>
        <echo message="${unix-dbs-dir} exists"/>
    </then>
    <else>
        <echo message="${unix-dbs-dir} doesn't exist"/>
    </else>
</if>

<copy todir="${dbsDir}" verbose="true">
    <fileset dir="${unix-dbs-dir}">
        <include name="*.bd"/>
    </fileset>
</copy>

这个输出是:

15:28:42      [echo] \hyperion\dbs doesn't exist
15:28:42 
15:28:42 BUILD FAILED
15:28:42 ... \hyperion\dbs does not exist.

如果我对远程 Windows 网络路径进行相同的尝试,它确实有效...

知道如何解决这个问题吗?似乎很奇怪,我只能使用我的 Windows 资源管理器访问 \hyperion\dbs,但蚂蚁显然不能...

Unix 是 CentOs 6.5,但我想这无关紧要。

一些额外的信息。我创建了一个小的 build.xml 脚本来将文件从我们的 Unix 机器复制到 Windows 机器。如果我从命令行执行 build.xml ant 脚本(顺便说一句,不是以管理员身份启动),那么输出是:

C:\Users\lievenc\TestCopyHyperion>%ANT_HOME%/bin/ant.bat -lib lib
Unable to locate tools.jar. Expected to find it in C:\Program Files\Java\jre1.8.
0_45\lib\tools.jar
Buildfile: C:\Users\lievenc\TestCopyHyperion\build.xml
     [echo] Load them from directory \srv-linuxdev\pde\appl\samplenet\dbs
     [echo] \srv-linuxdev\pde\appl\samplenet\dbs exists
     [copy] Copying 1 file to C:\Users\lievenc\TestCopyHyperion
     [copy] Copying \srv-linuxdev\pde\appl\samplenet\dbs\apif.d to C:\Users\lievenc\TestCopyHyperion\apif.d

从 Jenkins 执行此 build.xml 脚本时,我得到以下输出:

[workspace] $ cmd.exe /C '"C:\Jenkins\tools\hudson.tasks.Ant_AntInstallation.9.4\bin\ant.bat -lib lib && exit %%ERRORLEVEL%%"'
Buildfile: C:\Jenkins\jobs\test-copying-from-hyperion\workspace\build.xml
     [echo] Load them from directory \srv-linuxdev\pde\appl\samplenet\dbs
     [echo] \srv-linuxdev\pde\appl\samplenet\dbs doesn't exist

似乎无法弄清楚有什么区别。 cmd.exe 必须以其他用户身份执行?我只是在这里猜测,但是从 Windows 中的命令行,我正在以域用户身份执行 ant。也许这与 Jenkins 不同?

Ant 脚本:

<?xml version="1.0"?>

<project basedir="." xmlns:ac="antlib:net.sf.antcontrib">

    <!-- antcontrib -->
    <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>

    <echo message="Load them from directory \srv-linuxdev\pde\appl\samplenet\dbs" />

    <if>
        <available file="\srv-linuxdev\pde\appl\samplenet\dbs" type="dir" />
        <then>
            <echo message="\srv-linuxdev\pde\appl\samplenet\dbs exists"/>
        </then>
        <else>
            <echo message="\srv-linuxdev\pde\appl\samplenet\dbs doesn't exist"/>
        </else>
    </if>

    <copy todir="${basedir}" verbose="true">
        <fileset dir="\srv-linuxdev\pde\appl\samplenet\dbs">
            <include name="apif.d"/>
        </fileset>
    </copy>

</project>

Can't seem to figure out what the difference is. cmd.exe must be executed as some other user?

100%。不仅用户不同,%PATH% 以及您可能缓存的任何凭据也不同。此外,您的 ant 可执行文件也不同。 运行 来自 cmd 你有来自 %PATH% 的任何应对。 运行 通过 Jenkins,使用 Jenkins 的安装之一。然而,这不是这里的问题。

Jenkins 用户取决于您的设置方式。如果是 Windows 服务,请通过 Windows 服务对话框管理用户,将其从 "Local System" 更改为您更熟悉的内容,例如您自己的用户。

首先要检查几件事。

  • 你能通过 Jenkins ping 主机吗?
    配置 "Execute Batch Command" 步骤,然后键入 ping srv-linuxdev。通过詹金斯执行。看看是否可行。

  • 如果完全省略 available 标记,您还能复制文件吗?

  • 如何设置访问 linux 共享的权限?是100%开放吗?针对哪个用户?我没有看到您的案例中传递了任何凭据。凭据是否缓存在您的用户会话中?这都与 Jenkins 运行 作为不同的用户有关。