轉載: java teln…

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

2011-05-11 13:17 911人閱讀 評論(1) 收藏 舉報

   先看看telnet 和ssh的定義:

   Telnet協議是TCP/IP協議中的一員,是Internet遠程登陸服務的標準協議和主要方式。它爲用戶提供了在本地計算機上完成遠程主機工作的能力。在終端使用者的電腦上使用telnet程序,用它連接到服務器。終端使用者可以在telnet程序中輸入命令,這些命令會在服務器上運行,就像直接在服務器的控制檯上輸入一樣。可以在本地就能控制服務器。要開始一個telnet會話,必須輸入用戶名和密碼來登錄服務器。Telnet是常用的遠程控制Web服務器的方法。

   SSH是一個用來替代TELNET、FTP以及R命令的工具包,主要是想解決口令在網上明文傳輸的問題。爲了系統安全和用戶自身的權益,推廣SSH是必要的。 SSH是英文Secure Shell的簡寫形式。通過使用SSH,你可以把所有傳輸的數據進行加密,這樣"中間人"這種攻擊方式就不可能實現了,而且也能夠防止DNS欺騙和IP欺騙。

   實際上,telnet和ssh的功能基本相同,都是實現遠程登陸的網絡協議。

   和其他多數協議一樣, java 中telnet ssh的實現也要經過三部曲:建立連接、使用連接 和釋放連接 。ssh是用以替換telnet 的一種協議,在java 編程中 ,ssh和telnet 的不同僅僅表現在建立連接和釋放連接中。

   使用連接的過程,其實就是發送命令和遠程服務器交互的過程,原理也很簡單:每向服務器發送一條命令,就等待服務器執行此命令後返回的字符流,暫且把它叫做一次交互。我們以在規定時間內接收這些字符流,如果這些字符流中出現了“命令提示符”,說明服務器處於等待狀態,我們就認爲此次交互完成,否則,此次交互失敗,出現異常。

   linux服務器上的命令提示符不多,登陸命令提示符就更有限了,一般就包括 用戶名提示符、密碼提示符 和登陸成功提示符(也叫命令提示符)這三類,不同linux的用戶命令提示符、密碼提示符也會稍有不同。

   下面簡單寫一個程序做telnet的測試,此程序僅作測試,所以很多寫法並不規範。

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

    (2)代碼如下:

 

   

[java] view plaincopy
  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] view plaincopy
  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] view plaincopy
  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.     }  
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章