转载: java telnet ssh 实现

来源:互联网 发布:中文域名诈骗 编辑:程序博客网 时间:2024/05/20 15:41
原文:http://blog.csdn.net/Code_cj/article/details/6411682

java telnet ssh 实现

2011-05-1113:17 911人阅读 评论(1) 收藏 举报

  先看看telnet 和ssh的定义:

  Telnet协议是TCP/IP协议中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。

  SSH是一个用来替代TELNET、FTP以及R命令的工具包,主要是想解决口令在网上明文传输的问题。为了系统安全和用户自身的权益,推广SSH是必要的。SSH是英文SecureShell的简写形式。通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。

  实际上,telnet和ssh的功能基本相同,都是实现远程登陆的网络协议。

  和其他多数协议一样, java 中telnetssh的实现也要经过三部曲:建立连接、使用连接 和释放连接 。ssh是用以替换telnet 的一种协议,在java编程中 ,ssh和telnet 的不同仅仅表现在建立连接和释放连接中。

  使用连接的过程,其实就是发送命令和远程服务器交互的过程,原理也很简单:每向服务器发送一条命令,就等待服务器执行此命令后返回的字符流,暂且把它叫做一次交互。我们以在规定时间内接收这些字符流,如果这些字符流中出现了“命令提示符”,说明服务器处于等待状态,我们就认为此次交互完成,否则,此次交互失败,出现异常。

  linux服务器上的命令提示符不多,登陆命令提示符就更有限了,一般就包括 用户名提示符、密码提示符和登陆成功提示符(也叫命令提示符)这三类,不同linux的用户命令提示符、密码提示符也会稍有不同。

  下面简单写一个程序做telnet的测试,此程序仅作测试,所以很多写法并不规范。

   (1)所需包:commons-net-2.2.jar

   (2)代码如下:

 

  

[java] viewplaincopy
  1. package telnet;  
  2. import java.io.IOException;  
  3. import java.io.InputStream;  
  4. import java.io.OutputStream;  
  5. import java.net.SocketException;  
  6. import java.util.regex.Pattern;  
  7. import org.apache.commons.net.telnet.TelnetClient;  
  8. public class Telnet  
  9.     private TelnetClient telnetClient;  
  10.     private InputStream inputStream;  
  11.     private OutputStream outputStream;  
  12.     private long timeout=30000;//默认超时为30秒  
  13.       
  14.     public void connect(String hostIp,int port,String userName,String password) throws SocketException, IOException{  
  15.         telnetClient=new TelnetClient();  
  16.         telnetClient.connect(hostIp, port);  
  17.         inputStream=telnetClient.getInputStream(); //接收服务器消息的输入流  
  18.         outputStream=telnetClient.getOutputStream();     //发送消息到服务器的输出流  
  19.         //连接完毕,服务器就等待客户发送 用户名,然后是密码  
  20.         if(sendLoginInfo(userName,".*PASSWORD:")){//假如发送完用户名后得到的提示符是密码提示符  
  21.             sendLoginInfo(password, "//]//$"); //假如发送密码信息后得到的提示符是命令提示符  
  22.          
  23.      
  24.     private boolean sendLoginInfo(String info,String regext){  
  25.         Pattern pattern=Pattern.compile(regext);  
  26.         try  
  27.             outputStream.write((info+"/n").getBytes());  
  28.             outputStream.flush();  
  29.             int i=-1 
  30.             StringBuilder sb=new StringBuilder();  
  31.             long startTime=System.currentTimeMillis();  
  32.             while(System.currentTimeMillis()-startTime
  33.                 while(i=(charinputStream.read())>-1){  
  34.                     if(i==-1){  
  35.                         throw  new IllegalArgumentException("接收不到消息");  
  36.                      
  37.                     char ch=(char)i;  
  38.                     if(ch=='/n'||ch=='/r'){ //命令提示符是最后在一行的  
  39.                         sb.delete(0sb.length());  
  40.                         continue 
  41.                      
  42.                     sb.append((char)ch);  
  43.   
  44.                     if(pattern.matcher(sb.toString()).find()){  
  45.                         return true 
  46.                      
  47.                  
  48.              
  49.             throw  new IllegalArgumentException("超时收不到提示符");  
  50.         catch (IOException e)  
  51.             close();  
  52.             return false 
  53.           
  54.      
  55.   
  56.     public String   send(String cmd){  
  57.         if(null==telnetClient||null==inputStream||null==outputStream){  
  58.             throw  new IllegalArgumentException("请先 建立连接 或建立连接失败");  
  59.          
  60.         Pattern pattern=Pattern.compile("//]//$");//假如命令提示符为 /$  
  61.         StringBuilder text=new StringBuilder();  
  62.         try  
  63.             outputStream.write((cmd+"/n").getBytes());  
  64.             outputStream.flush();  
  65.             StringBuilder sb=new StringBuilder();  
  66.             long startTime=System.currentTimeMillis();  
  67.             int i=-1 
  68.             while(System.currentTimeMillis()-startTime
  69.                 while(i=inputStream.read())>-1){  
  70.                     if(i==-1){  
  71.                         throw  new IllegalArgumentException("接收不到消息");  
  72.                      
  73.                     char ch=(char)i;  
  74.                     text.append(ch);  
  75.                     if(ch=='/n'||ch=='/r'){  
  76.                         sb.delete(0sb.length());  
  77.                         continue 
  78.                             
  79.                     sb.append(ch);    
  80.                     if(pattern.matcher(sb.toString()).find()){//返回字符流中找到了命令提示符  
  81.                         return text.toString();  
  82.                      
  83.                  
  84.              
  85.             throw  new IllegalArgumentException("超时收不到提示符");  
  86.         catch (IOException e)  
  87.             close();  
  88.             return null 
  89.           
  90.      
  91.     public void close(){  
  92.         if(null!=null){  
  93.             try  
  94.                 telnetClient.disconnect();  
  95.             catch (IOException e)  
  96.                 e.printStackTrace();  
  97.              
  98.          
  99.      
  100.     public static void main(String[] args) throws SocketException, IOException  
  101.         Telnet telnet=new Telnet();  
  102.         telnet.connect("ip" 23"username""passowrd");  
  103.         System.out.println(telnet.send("ls"));  
  104.         telnet.close();  
  105.      
  106.  
 

   ssh 的实现和和 telnet 大同小异,差别在于建立连接和释放连接:

   (1)需要包:jsch-0.1.42.jar

   (2) 关键代码如下:

    

[java] viewplaincopy
  1.   
  2.     public void connect(String hostIp,int port,String userName,String password){  
  3.         try  
  4.             session=jsch.getSession(userName,hostIp,port );  
  5.             session.setPassword(password);  
  6.             session.setUserInfo(defaultUserInfo);  
  7.             session.connect();  
  8.             channel=session.openChannel("shell");  
  9.             inputStream=channel.getInputStream();  
  10.             outputStream=channel.getOutputStream();  
  11.         catch (JSchException e)  
  12.             // TODO Auto-generated catch block  
  13.             e.printStackTrace();  
  14.         }catch (IOException e)  
  15.             // TODO Auto-generated catch block  
  16.             e.printStackTrace();  
  17.          
  18.      
  19.   //关闭连接  
  20.     public void  close(){  
  21.        if(null!=channel){  
  22.            channel.disconnect();  
  23.         
  24.        if(null!=session){  
  25.            session.disconnect();  
  26.         
  27.      
 

 其中 defaultUserInfo是实现了UserInfo的一个类对象:

 

[java] viewplaincopy
  1. UserInfo defaultUserInfo new UserInfo()  
  2.         public String getPassphrase()  
  3.             return null 
  4.          
  5.         public String getPassword()  
  6.             return null 
  7.          
  8.         public boolean promptPassword(String arg0)  
  9.             return false 
  10.          
  11.         public boolean promptPassphrase(String arg0)  
  12.             return false 
  13.          
  14.         public boolean promptYesNo(String arg0)  
  15.             return true 
  16.          
  17.         public void showMessage(String arg0)  
  18.          
  19.      
 
0 0