使用Ant进行ssh和scp操作

一、简介:

  现在我们安装Linux的时候通常考虑到安全因素(默认情况下)是不打开telnet服务的,而ssh服务是有的,ant很早就支持telnet,但要求我们在Linux下要安装telnet-server,并要启用该服务。

    还好自Ant1.60开始支持了SSH 及SCP 操作了,早在Ant之前若要支持SSH、SCP、SFTP等任务就必须下载j2ssh的j2ssh-ant.jar和j2ssh-core.jar(在http://www.sourceforge.net的j2ssh下有下载)。现在可以使用Ant提供的Sshexec和scp任务,由$ANT_HOME/lib/ant-jsch.jar提供支持,但是同样你也要在http://www.jcraft.com/jsch/index.html下载一个依赖包jsch-0.1.24.jar(文件名因版本而不同),jsch同样也是http://www.sourceforge.net下的一个项目。

    你需要把下载的jsch-0.1.24拷贝到$ANT_HOME/lib下,如果是Eclipse下的Ant环境必须在Window->Preferences->Ant->Runtime->Classpath中加入jsch-0.1.24。

JSch是一个SSH2的纯Java实现

    JSch允许你连接到sshd server并采用端口映射,X11映射; Scp文件传输等,你可以把集成JSch提供的功能到你自己的Java项目中,JSch 的授权方式为 BSD形式。

二、简单例子:

  下面是用JSch完成Sshexec和scp两个任务的最简单例子,如果需要更详细的内容,请参考Ant用户手册

[Sshexec任务]

<target name="sshexec">

        <sshexec host="10.14.50.63" username="abs" password="abs" 

               trust="true" command="cd /;ls" />

</target>

注意上面的trust属性一般设置为true, 如果为默认值false时,那么就要求你所连接的host必须存在于你的knownhosts文件中,并且这个文件也必须是存在的,否则会出现 com.jcraft.jsch.JSchException: reject HostKey: 192.168.122.180异常。执行Linux下的命令时可以用分号”;”把多个命令隔开,它们将会依次执行,而不需要写多个sshexec进行多次连接,每次连接只执行一个命令。

 

[scp任务]<远程以根目录计算>

1.拷贝单个文件到远端服务器

<scp file=“c:/cmd.txt” todir=“root:123456@192.168.122.180:/tmp” trust=“true”/>



<scp file=“c:/cmd.txt” todir=“root@192.168.122.180:/tmp” password=“123456″ trust=“true”/>



2.拷贝远端文件本地

<scp file=“root:123456@192.168.122.180:/tmp/cmd.txt” todir=“D:/my-app”  trust=“true”/>



3.拷贝远端目录到本地,将以递归形式操作

<scp file=“root:123456@192.168.122.180:/tmp/*” todir=“d:/my-app” trust=“true”/>



4.拷贝本地目录中的内容到远端,递归形式,但不在服务器上建立my-app目录

<scp todir=“root:123456@192.168.122.180:/tmp/” trust=“true”>

   <fileset dir=“d:/my-app”/>

</scp>

5.拷贝一系列的文件到远端,会建立相应的层次目录,不建立my-app目录

<scp todir=“root:123456@192.168.122.180:/tmp” trust=“true”>

   <fileset dir=“d:/my-app”>

      <include name=“**/*.java” />

   </fileset>

</scp>

<scp todir=“root:123456@192.168.122.180:/tmp” trust=“true”>

   <fileset dir=“d:/my-app” excludes=“**/*.java”/>

</scp>

 

三、其他例子:

例子1:

<project name="buildssh" default="DEFAULT" basedir=".">

 <target name="init">

 <!--   set   properties,   mkdir,   etc.   -->

 <property file="build.properties" />

 <property name="this.project" value="buildssh" />

 <echo message="init   in   ${this.project}" />

 <tstamp />

 </target>

 <target name="DEFAULT" depends="init">

 <echo message="connecting   to   ${build.server}" />

 <sshexec host="Linux   server   IP   address" 

 username="Linux   server     username"

 password="Linux   server   password" trust="true"

 command="Command   you   want   to   run   on   the   server" />

 </target>

</project>


 

例子2:

import com.jcraft.jsch.Channel;

import com.jcraft.jsch.ChannelSftp;

import com.jcraft.jsch.JSch;

import com.jcraft.jsch.Session;

import com.jcraft.jsch.UserInfo;




public class ExecSCP {

 public static final UserInfo defaultUserInfo = new UserInfo() {

 public String getPassphrase() {

 return null;

 }

 public String getPassword() {

 return null;

 }

 public boolean promptPassword(String arg0) {

 return false;

 }

 public boolean promptPassphrase(String arg0) {

 return false;

 }

 public boolean promptYesNo(String arg0) {

 return true;

 }

 public void showMessage(String arg0) {

 }

 };




 public static void main(String[] args) throws Exception {

 String hostname = "10.14.50.63";

 String username = "abs";

 String password = "abs";

 String remoteFile = "asbpack.sh";

 String localFile = "C:\\";

 JSch jsch = new JSch();

 /**

  * 22为端口

  */

 Session session = jsch.getSession(username, hostname, 22);

 session.setPassword(password);

 session.setUserInfo(defaultUserInfo);

 session.connect();

 Channel channel = session.openChannel("sftp");

 channel.connect();

 ChannelSftp c = (ChannelSftp) channel;

 c.get(remoteFile, localFile);

 session.disconnect();

 }

}