转载: java telnet ssh 实现

原文: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=(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.     }  
 

转载于:https://www.cnblogs.com/leeeee/p/7276566.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iostat -x命令诊断

-x 参数iostat还有一个比较常用的选项-x,该选项将用于显示和io相关的扩展数据。iostat -d -x -k 1 10Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %utilsda 1.56 28.31 7.80 31.49 42…

prometheus命令_Prometheus入门教程(一):Prometheus 快速入门

点击蓝色“陈树义”关注我哟Prometheus 是任何一个高级工程师必须要掌握的技能。那么如何从零部署一套 Prometheus 监控系统呢?本篇文章将从 Prometheus 的原理讲起,手把手带你用一个最简单的例子部署一套 Prometheus 监控系统。基本原理Prometheus 的基…

WordPress在前台文章页添加后台编辑该文章按钮

在完善主题(wpsite 主题)的过程中,碰到这样一个问题,如何给 wordpress 文章页面添加一个编辑按钮呢?也就是当用户登录并有权限的时候,可以直接点击该按钮去后台编辑该文章,这对于陌小雨这种有一…

android的progressDialog 的使用。android数据异步加载 对话框提示

在调用的Activity中定义一个全局的 progressDialog 点击按钮的时候调用下面这句 progressDialog ProgressDialog.show(SearchActivity.this, "请稍等...", "获取数据中...", true); 在异步加载完成的时候 progressDialog.dismiss()转载于:https://www.cnb…

Java不定参数

先看两个简单的例子,来感受一下Java的不定长度参数 第一个例子: Java代码 public class VariArgs { public static void main(String[] args) { test(); test("aaa"); test("aaa", "bbb&q…

参数估计_随机微分方程的参数估计(一)

随机微分方程,俗称SDE,相信点进来的同学们肯定对这个概念不感到陌生。SDE呢,是对现实生活中一些随机波动的事物的建模,比如可以用几何布朗运动(GBM)来模拟股价变化,用CIR模型来模拟利率波动。然而一个很现实的问题就是…

「mysql优化专题」主从复制面试宝典!面试官都没你懂得多!(11)

内容较多,可先收藏,目录如下: 一、什么是主从复制 二、主从复制的作用(重点) 三、主从复制的原理(重中之重) 四、三步轻松构建主从 五、必问面试题干货分析(最最重要的点&#xff09…

为什么WordPress网站应尽量避免使用过多插件

前几天,我们在给一个客户优化其企业网站时,发现其网站使用了太多的WordPress插件。WP插件可以扩展网站的功能;然而如果使用不当,也会给网站带来一些负面的影响。在这篇文章中,WPChina.org就给大家介绍一下,…

OracleApps Dropship 流程

做的一个Dropship流程的实录(包括流程期间遇到问题的解决)What are the advantages of Drop Shipment Orders?These are the benefits: No inventory is required Reduced order fulfillment processing costs Reduced flow times Elimination of losses on non-sellable …

word取消下一页_word文档页码设置及文中小箭头清除办法

在很长一段时间里,朋友圈流传的这样一段话:世人慌慌张张,不过图碎银几两;可偏偏就是这几两碎银,能免饥荒,能定安康 ,能解世人惆怅。。。问:word怎么从第二页开始加页码答&#xff1a…

html语义

1、<Hx> <h1>、<h2>、<h3>、<h4>、<h5>、<h6>,作为标题使用&#xff0c;并且依据重要性递 减。 <h1>是最高的等级。 2、<p>作为段落 利用行高(line-height)很容易的定义出行间距 3、<ul>、<ol>、<li>…

一起写框架-Ioc内核容器的实现-对象的调用-属性注入容器的对象(十)

实现功能 需求&#xff1a;在类的成员属性使用Autowirde注解注入容器中的对象。 实现思路 要实现这个功能。我们首先要思考一个问题&#xff1a;类与类的关系是在调用的建立的&#xff0c;还是说在创建对象的时候就就将建立了&#xff1f; ---我实现的方案是&#xff0c;在在程…

2064: 分裂 - BZOJ

Description 背景&#xff1a; 和久必分&#xff0c;分久必和。。。 题目描述&#xff1a; 中国历史上上分分和和次数非常多。。通读中国历史的WJMZBMR表示毫无压力。 同时经常搞OI的他把这个变成了一个数学模型。 假设中国的国土总和是不变的。 每个国家都可以用他的国土面积代…

android h5使用缓存_Android SDK 的 H5 打通方案演进 | 数据采集

一、前言近年来&#xff0c;混合开发越来越流行&#xff0c;App 与 H5 的打通需求也越来越迫切。那什么是 App 与 H5 打通呢&#xff1f;所谓 “打通”&#xff0c;是指 H5 集成 JavaScript 数据采集 SDK 后&#xff0c;H5 触发的事件不直接同步给服务端&#xff0c;而是先发给…

渐渐褪色的彩虹 好像一个梦

渐渐褪色的彩虹 好像一个梦 ——初梦 好像从来没写过游记呢...就权当记流水账随便写一些吧 11.10 Day 0 期待又紧张&#xff0c; 像以前一样坐高铁&#xff0c; 车上打了打几个板子&#xff0c;抵达广州&#xff0c; 时间过的真快啊... 到达酒店&#xff0c; 这也许又(?)是我…

php 开发框架 (资料收集)

PHP最流行的框架是Laravel, Symfony, CodeIgniter, Yii 1 and 2&#xff0c;Phalcon 和其他一些&#xff0c;这些工具能帮你创建功能强大而整洁的应用程序 Laravel与thinkPHP的异同点 主要区别:(thinkPHP更适合国人的编码习惯) TP5更简单实用&#xff0c;文档丰富&#xff0c;…

Android的Button按钮,ACTION_UP事件不触发解决方案

在android 编程时&#xff0c;有时候要实现当Button一直按下的时候&#xff0c;执行一些逻辑代码&#xff0c;当按钮弹起的时候&#xff0c;终止这些逻辑代码的执行。 比如在 设置页面的滑动开关时&#xff0c;如果不监听ACTION_CANCEL&#xff0c;在滑动到中间时&#xff0c;如…

简单人物画像_你真的理解用户画像吗?| 船说

“「设计师沙龙」是ARK下半年开始逐渐形成的传统&#xff0c;由ARKers自发组织&#xff0c;分为视觉和交互两类&#xff0c;每月各举办一次。大家围绕一个话题展开&#xff0c;聊聊行业最新案例和工作上的心得&#xff0c;帮助大家共同进步。ARKers表达的观点均为个人见解&…

try catch线程问题???

try。。。catch 在遇见异常是会开启一个新的线程&#xff0c;用来处理异常&#xff0c;转载于:https://www.cnblogs.com/Flyrun/p/7828788.html