使用sshsession Ant任务执行远程命令



我的sshsession Ant任务有问题。

我正在编写一个部署脚本,bzip源,scp存档到远程服务器,然后在远程服务器上解压缩源,并将文件复制到正确的目录树。

(...)
<bzip2 src="/tmp/${selected.target}.tar" destfile="/tmp/${selected.target}.tar.bz2"/>
<scp file="/tmp/${selected.target}.tar.bz2" todir="user@server:/tmp/" keyfile="${user.home}/.ssh/id_rsa" trust="yes" passphrase="thisisasecret"/>
<sshsession host="server" username="user" keyfile="${user.home}/.ssh/id_rsa" trust="yes">
    <sequential>
        <untar src="/tmp/${selected.target}.tar.bz2" dest="/tmp/prova_untar" compression="bzip2"/>
        (copy files)
    </sequential>
</sshsession>
(...)

我的问题是在sshsession中指定的任务,因为它们是在本地执行的,而不是在远程服务器上。我认为(但显然我错了)在sshsession标签中指定的命令将在我刚刚连接到的服务器上执行。我在文档中读到,你可以用localtunnel和remotetunnel指定隧道,但我不确定我是否正确理解这些隧道是为了什么。有人遇到过同样的问题吗,或者有解决方案吗?我正在使用的Ant版本是1.8.2。谢谢你,

阿尔贝托。

我添加了一个答案来展示我们如何使用remote-build.xml。

例如,我们想在数据库服务器上部署一些预构建的SQL文件,将SQL文件插入MySQL中的数据库,然后重新启动MySQL。

<?xml version="1.0" encoding="UTF-8"?>
<project name="remote-build" basedir=".">
    <target name="run">
        <antcall target="extract" />
        <antcall target="build-database" />
        <antcall target="restart-mysql" />
    </target>
    <target name="extract">
        <unzip src="sample-sql.zip" dest="."/>
    </target>
    <target name="build-database">
        <taskdef name="insert" classname="my.company.ant.ParallelInsertSQL" classpath="my-company-lib.jar"/>
        <insert dbName="${database.name}" masterSQLs="${basedir}/sample-sql.sql" sqlDir="${basedir}/tables"/>
        <antcall target="restart-database"/>
    </target>
    <target name="restart-database">
        <exec executable="bash" inputstring="echo '${database.password}' | sudo -S /etc/init.d/mysql restart"/>
    </target>
</project>

因此,在部署时,我们将sql文件归档(sample-sql.zip)与"my-company-lib.jar"one_answers"remote-build.xml"打包在一起,然后使用scp传输归档文件。
然后,ssheexec "ant -f remote-build.xml run"(您可以将这些属性放在属性文件中,也可以在ssheexec命令行中传输它们)。

虽然这个问题并不新鲜,但我今天发现自己遇到了类似的情况。我的目标是在远程服务器上上传文件并运行命令,我必须(通过另一台服务器)连接到远程服务器。给出的答案(需要远程服务器上的ant)对我来说是完全不可接受的,但是这里的评论帮助我构建了这个解决方案

sshsession只创建一个隧道,您可以将其用于其中的任务。其中的任务不会自动在远程服务器上运行,但是您可以将sshexec任务与隧道一起使用来实现这一点。而且,scp任务现在可以通过隧道上传到远程服务器。下面是一个例子:

<sshsession host="${jumphost}" port="22" username="${user}" password="${password}" trust="true">
    <localtunnel lport="${localTunnelPort}" rhost="${targethost}" rport="22"/>
    <sequential>
        <!-- run a command on the remote server (here mkdir) -->
        <sshexec host="localhost" port="${localTunnelPort}" username="${user.param}" password="${password.param}" command="mkdir ${home}/foobar" trust="true" />
        <!-- upload a file to the remote server -->
        <scp port="${localTunnelPort}" file="test_file.txt" todir="${user.param}:${password.param}@localhost:${home}/foobar/" trust="true" />
    </sequential>
</sshsession>

相关内容

  • 没有找到相关文章

最新更新