Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用sshsession Ant任务执行远程命令_Ant - Fatal编程技术网

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

使用sshsession Ant任务执行远程命令,ant,Ant,我对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/"

我对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。 谢谢


Alberto

我添加了一个答案来说明如何使用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文件归档(示例sql.zip)与“my company lib.jar”和“remote build.xml”打包在一起,然后使用
scp
传输归档文件

然后,sshexec“ant-f remote-build.xml run”(您可以将属性放在属性文件中,也可以在sshexec命令行中传输它们)。

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

sshs会话
仅创建一个可用于中任务的隧道。中的任务不会自动在远程服务器上运行,但您可以将
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>


我认为您需要使用。sshsession似乎是用于连接隧道而不是用于远程执行。谢谢。我选择sshsession是因为我需要执行一系列远程命令,而sshexec每次都会打开一个新会话..我们有类似的情况--执行一系列远程命令,我们要做的是编写一个“remote build.xml”并将其与其他文件一起复制到远程机器上。当然,我们必须在远程机器上安装ant,但我认为这是可以的。Localtunnel是将本地端口转发到远程端口,这样您就可以在本地应用程序中使用localhost:localport连接到remotehost:remoteport。远程隧道是反向的。它将本地端口转发到远程端口,以便当您希望远程应用程序连接到计算机中的一个端口,并且不希望在防火墙中设置异常时,也不要将所需的ssh证书放入远程主机。对于ant任务,它们中的许多都是用纯java编写的(只是扩展了ant的任务类),因此它们不能通过sshsession远程运行。谢谢@coolcfan!与此同时,我通过使用sshexec和一个简单的命令列表(用分号分隔)解决了我的问题——这很尴尬,但它确实有效。你的方法看起来更干净,我会尝试一下。解决方法不错,不幸的是,你必须在远程机器上安装ant,而这在生产环境中并不总是可能的。我认为
sshsession
任务是误导性的,因为它不能执行远程运行ant任务所需的操作。我想知道是否有一个任务或库能够实现这一目标,因为它将使内容比在
sshexec
@michael中使用shell命令更干净。如果目标机器上没有安装ant,那么我们可以部署其他东西,如windows批处理文件或linux shell脚本。。。我认为远程执行ant任务很困难——它也需要安装ant。