• 转载: java telnet ssh 实现


    原文:http://blog.csdn.net/Code_cj/article/details/6411682

    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=(char) inputStream.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(0, sb.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(0, sb.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.     }  
     
  • 相关阅读:
    mysql explain用法和结果的含义
    heapset水平自动扩容
    dashboard安装
    对List集合中的对象进行按某个属性排序
    MySql查询当天、本周、本月、本季度、本年的数据
    三种List集合的遍历方式
    Date相关处理
    ubuntu-14.04.2-desktop使用方法
    PowerShell命令卸载Win10内置应用
    Windows下MySQL绿色版安装配置与使用
  • 原文地址:https://www.cnblogs.com/leeeee/p/7276566.html
Copyright © 2020-2023  润新知