2011-12-14 92 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>