2011-12-14 29 views
2

我遇到了与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="[email protected]:/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。 谢谢,

阿尔贝托

+0

我认为你需要使用[sshexec](https://ant.apache.org/manual/Tasks/sshexec.html)。 sshsession似乎是用于连接隧道,而不是用于执行reomote。 – oers 2011-12-14 11:35:03

+0

谢谢oers。我选择了sshsession,因为我需要执行一个远程命令列表,而sshexec只是每次打开一个新会话。 – geezmo 2011-12-14 11:37:17

回答

3

我添加了一个答案,以展示我们如何使用远程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)以“我-公司lib.jar”和“远程build.xml文件”在一起,然后转移与归档文件scp
然后,sshexec“ant -f remote-build.xml run”(您可以将属性放置在属性文件中或将它们传送到sshexec命令行中)。

0

虽然这个问题并不完全是新的,但我发现自己今天处于类似的情况。我的目标是在必须通过隧道(通过另一台服务器)的远程服务器上传文件和运行命令。给定(在远程服务器上需要蚂蚁)的答案对我来说是完全不能接受的,但这里的评论帮助我建立这个解决方案

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>