【问题标题】:Executing remote commands with sshsession Ant task使用 sshsession Ant 任务执行远程命令
【发布时间】:2011-12-14 10:58:30
【问题描述】:

我遇到了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。 谢谢,

阿尔伯托

【问题讨论】:

  • 我认为你需要使用sshexec。 sshsession 似乎是用于连接隧道而不是用于远程执行。
  • 谢谢oers。我选择 sshsession 是因为我需要执行远程命令列表,而 sshexec 每次都会打开一个新会话..
  • 我们也有类似的情况——执行一个远程命令列表,我们要做的就是写一个“remote-build.xml”和其他文件一起复制到远程机器上。当然,我们必须在远程机器上安装 ant,但我认为这样就可以了。
  • Localtunnel 是将本地端口转发到远程端口,这样您就可以在本地应用程序中使用 localhost:localport 连接到 remotehost:remoteport。远程隧道反转。它将您的本地端口转发到远程端口,以便当您希望远程应用程序连接到计算机中的一个端口并且您不想在防火墙中设置异常时,也不要将所需的 ssh 证书放入远程主机。对于ant任务,很多都是用纯java写的(只是扩展了ant的任务类),所以应该不能用sshsession远程运行。
  • 谢谢@coolcfan!同时,我通过使用带有简单命令列表(由分号分隔)的 sshexec 解决了我的问题 - 这很尴尬,但它确实有效。你的方法看起来更干净,我试试看。

标签: ant


【解决方案1】:

我添加一个答案来展示我们如何使用 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”和“remote-build.xml”打包在一起,然后用scp传输归档文件。
然后,sshexec "ant -f remote-build.xml run"(你可以把属性放在属性文件中,也可以在 sshexec 命令行中传输)。

【讨论】:

  • 不错的解决方法,不幸的是,您必须在远程机器上安装 ant,而这在生产环境等中并不总是可行。我认为 sshsession 任务具有误导性,因为它没有执行您期望的操作它要做的是远程运行 ant 任务。我想知道是否有一个任务或库能够实现这个目标,因为它比使用带有sshexec 的 shell 命令更干净
  • @michael 如果目标机器上没有安装ant,那么我们可以部署别的东西,比如windows批处理文件,或者linux shell脚本……我觉得远程执行ant任务很难——它也应该需要安装 ant。
【解决方案2】:

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

sshsession 只创建一个隧道,您可以将其用于其中的任务。其中的任务不会自动在远程服务器上运行,但您可以使用 sshexec 任务和 tunnel 来实现。此外,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>

【讨论】:

    猜你喜欢
    • 2012-09-19
    • 1970-01-01
    • 2014-02-14
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2021-05-10
    相关资源
    最近更新 更多