SSH是Secure Shell的缩写,一种建立在应用层和传输层基础上的安全协议。SSH在连接和传送过程中会加密所有数据,可以用来在不同系统或者服务器之间进行安全连接。SSH提供两种的安全验证方式:基于密码的认证和基于密匙的认证。其中,基于密码的认证比较简单,只要知道远程主机的用户名和密码,就可以进行登录。基于密匙的认证比较麻烦,而且连接比较耗时,这里不详细介绍。有很多基于SSH协议的客户端,例如:PuTTY、OpenSSH、Xshell 4等,可以远程连接几乎所有UNIX平台。同时,可以通过Linux命令行ssh uername@host连接到某主机。
在项目中,如何利用代码实现SSH,远程执行Shell脚本呢?JSch是Java Secure Channel的缩写,是一个SSH2功能的纯Java实现,具体信息可以参考JSch官网。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,同时你也可以集成它的功能到你自己的应用程序。在使用前,需要下载并导入JSch包:jsch-0.1.50.jar。
实例代码如下,同时可以参考
官网的例子以及其他的例子
-
# cat Exec.java
-
import com.jcraft.jsch.*;
-
import java.awt.*;
-
import javax.swing.*;
-
import java.io.*;
-
-
public class Exec{
-
public static void main(String[] arg){
-
try{
-
JSch jsch=new JSch();
-
-
System.out.print("host:user:password are " + arg[0] + arg[1] + arg[2]);
-
-
String host=arg[0];
-
String user=arg[1];
-
-
Session session=jsch.getSession(user, host, 22);
-
-
session.setPassword(arg[2]);
-
session.setConfig("StrictHostKeyChecking", "no");
-
session.connect(60 * 1000);
-
-
String command=arg[3];
-
-
Channel channel=session.openChannel("exec");
-
((ChannelExec)channel).setCommand(command);
-
-
channel.setInputStream(null);
-
-
((ChannelExec)channel).setErrStream(System.err);
-
-
InputStream in=channel.getInputStream();
-
-
channel.connect();
-
-
byte[] tmp=new byte[1024];
-
while(true){
-
while(in.available()>0){
-
int i=in.read(tmp, 0, 1024);
-
if(i<0)break;
-
System.out.print(new String(tmp, 0, i));
-
}
-
if(channel.isClosed()){
-
if(in.available()>0) continue;
-
System.out.println("exit-status: "+channel.getExitStatus());
-
break;
-
}
-
try{Thread.sleep(1000);}catch(Exception ee){}
-
}
-
channel.disconnect();
-
session.disconnect();
-
}
-
catch(Exception e){
-
System.out.println(e);
-
}
-
}
-
-
}
运行结果:
-
[root@aie-cntest2-110 tmp]# CLASSPATH=/tmp/jsch.jar:. javac Exec.java
-
-
[root@aie-cntest2-110 tmp]# CLASSPATH=/tmp/jsch.jar:. java Exec localhost root password "ls -la /"
-
host:user:password are localhostrootrootroottotal 194
-
drwxr-xr-x 26 root root 4096 Apr 28 10:04 .
-
drwxr-xr-x 26 root root 4096 Apr 28 10:04 ..
-
drwxr-xr-x 2 root root 4096 May 8 2013 bin
-
drwxr-xr-x 4 root root 1024 Oct 29 2012 boot
-
drwxr-xr-x 12 root root 4300 Apr 28 10:05 dev
另一种模拟shell的方式:
-
private ArrayList<String> runcommand(String command) {
-
File tmpfile = new File(System.getProperty("java.io.tmpdir")+"_cli_output_.log");
-
tmpfile.deleteOnExit();
-
ArrayList<String> results = new ArrayList<String>();
-
-
try {
-
JSch jsch = new JSch();
-
Session session = jsch.getSession(USER, HOST, PORT);
-
session.setPassword(PASSWORD);
-
session.setConfig("StrictHostKeyChecking", "no");
-
session.connect(60 * 1000);
-
-
Channel channel=session.openChannel("shell");
-
channel.setInputStream(new ByteArrayInputStream(command.getBytes()));
-
channel.setOutputStream(new FileOutputStream(tmpfile));
-
channel.connect();
-
-
Thread.sleep(10000);
-
channel.disconnect();
-
session.disconnect();
-
-
Scanner readtmpfile = new Scanner(tmpfile);
-
try {
-
String rtnline;
-
while(readtmpfile.hasNext()) {
-
rtnline = readtmpfile.nextLine();
-
results.add(rtnline);
-
System.out.println(rtnline);
-
}
-
} catch (Exception e) {
-
e.printStackTrace();
-
}
-
-
return results;
-
}
阅读(5731) | 评论(0) | 转发(0) |