一、简介:
现在我们安装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任务]
<BR><target name="sshexec">
<sshexec host="192.168.122.180" username="root" password="123456"
trust="true" command="cd /;ls"/>
</target>
注意上面的trust属性一般设置为true, 如果为默认值false时,那么就要求你所连接的host必须存在于你的knownhosts文件中,并且这个文件也必须是存在的,否则会出现 com.jcraft.jsch.JSchException: reject HostKey: 192.168.122.180异常。执行Linux下的命令时可以用分号";"把多个命令隔开,它们将会依次执行,而不需要写多个sshexec进行多次连接,每次连接只执行一个命令。
该任务的执行后输出结果如下:
sshexec:
[sshexec] Connecting to 192.168.122.180:22
[sshexec] backup
[sshexec] bin
[sshexec] boot
[sshexec] dev
[sshexec] etc
...................
[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>
最后一个任务的执行输出结果如下(其他略):
scp:
[scp]Connecting to 192.168.122.180:22
[scp] Sending: cmd.txt : 0
[scp] File transfer time: 0.0 Average Rate: ? B/s
[scp] Sending: pom.xml : 852
[scp] File transfer time: 0.0 Average Rate: ∞ B/s
[scp] Sending: application.properties : 142
[scp] File transfer time: 0.0 Average Rate: ∞ B/s
[scp] Sending: application.properties : 45
[scp] File transfer time: 0.0 Average Rate: ∞ B/s
[scp] Sending: test.properties : 0
[scp] File transfer time: 0.02 Average Rate: 0.0 B/s
[scp] Sending: application.properties : 153
[scp] File transfer time: 0.0 Average Rate: ∞ B/s
[scp] Sending: application.properties : 45
[scp] File transfer time: 0.0 Average Rate: ∞ B/s
[scp] done.
三、其他例子:
例子1:
<?xml version= "1.0 "?>
<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>
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) {
}
};
/**
* @param args
*/
public static void main(String[] args) throws Exception{
String hostname = "www.mozat.com ";
String username = "wiimii ";
String password = "jtev000 ";
String remoteFile = "Setup.ini ";
String localFile = "C:\\ ";
JSch jsch=new JSch();
Session session=jsch.getSession(username, hostname, 990);
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();
}
}
http://blog.chinaunix.net/space.php?uid=9185626&do=blog&id=2007143