介绍

本文介绍如何通过Telnet协议连接到远程Shell,执行脚本,并获取执行结果;

相关文章:
《【Jsch】使用SSH协议连接到远程Shell执行脚本》http://www.cnblogs.com/ssslinppp/p/6244653.html 
其他示例:

maven仓库

使用Apache Commons-net通用库;
  1. <dependency>
  2. <groupId>commons-net</groupId>
  3. <artifactId>commons-net</artifactId>
  4. <version>3.4</version>
  5. </dependency>

《Apache Commons Net示例》http://commons.apache.org/proper/commons-net/  
包括:
  • FTP/FTPS
  • FTP over HTTP (experimental)
  • NNTP
  • SMTP(S)
  • POP3(S)
  • IMAP(S)
  • Telnet
  • TFTP
  • Finger
  • Whois
  • rexec/rcmd/rlogin
  • Time (rdate) and Daytime
  • Echo
  • Discard
  • NTP/SNTP
  • Backgr

具体步骤

  • 步骤1: 使用TelnetClient创建连接:connect();
  • 步骤2: 设置Telnet属性:如 回显选项/SUPPRESS GO AHEAD/终端类型等;
  • 步骤3: 获取输入/输出流:getInputStream()/getOutputStream();
  • 步骤4: 使用username和password进行登录;
  • 步骤5: 执行Shell脚本,获取执行结果;
  • 步骤6: 关闭资源:输入/输出流,TelnetClient连接等;

程序

步骤1~步骤6

执行具体脚本

测试程序


完整程序

  1. package com.sssppp.Communication;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import java.net.InetAddress;
  6. import java.net.SocketTimeoutException;
  7. import org.apache.commons.net.telnet.EchoOptionHandler;
  8. import org.apache.commons.net.telnet.SuppressGAOptionHandler;
  9. import org.apache.commons.net.telnet.TelnetClient;
  10. import org.apache.commons.net.telnet.TerminalTypeOptionHandler;
  11. public class TelentCommUtil {
  12. /**
  13. * 测试程序
  14. *
  15. * @param args
  16. */
  17. public static void main(String[] args) {
  18. String ip = "10.180.137.221";
  19. int port = 23;
  20. String localIp = null;
  21. int localPort = 0;
  22. int timeOut = 3000;
  23. String userName = "xxxxx";
  24. String password = "xxxxx";
  25. String[] cmds = new String[] { "ifconfig | grep eth0\n",
  26. "cat /etc/redhat-release\n" };
  27. String[] result = null;
  28. try {
  29. result = execShellCmdByTelnet(ip, port, localIp, localPort, timeOut,
  30. userName, password, cmds);
  31. } catch (Exception e) {
  32. e.printStackTrace();
  33. }
  34. if (result != null) {
  35. for (String string : result) {
  36. System.out.println(string);
  37. System.out.println("-------------------");
  38. }
  39. }
  40. }
  41. /**
  42. * 使用Telnet协议,连接到Linux Shell,执行脚本命令,并获取结果
  43. *
  44. * @param dstIp
  45. * @param dstPort
  46. * @param localIp
  47. * @param localPort
  48. * @param timeOut
  49. * @param userName
  50. * @param password
  51. * @param cmds
  52. * @return
  53. * @throws Exception
  54. */
  55. public static String[] execShellCmdByTelnet(String dstIp, int dstPort,
  56. String localIp, int localPort, int timeOut, String userName,
  57. String password, String... cmds) throws Exception {
  58. TelnetClient tc = new TelnetClient();
  59. InputStream is = null;
  60. OutputStream os = null;
  61. try {
  62. //设置:RFC 1091 TELNET终端类型选项
  63. tc.addOptionHandler(new TerminalTypeOptionHandler("VT100", false,
  64. false, true, false));
  65. //设置:RFC 857 TELNET ECHO 回显选项
  66. tc.addOptionHandler(new EchoOptionHandler(true, false, true, false));
  67. //设置:RFC 858 TELNET SUPPRESS GO AHEAD(抑制继续进行)选项
  68. tc.addOptionHandler(new SuppressGAOptionHandler(true, true, true,
  69. true));
  70. tc.setConnectTimeout(timeOut);
  71. if (localIp == null) {
  72. tc.connect(dstIp, dstPort);
  73. } else {
  74. tc.connect(InetAddress.getByName(dstIp), dstPort,
  75. InetAddress.getByName(localIp), localPort);
  76. }
  77. is = tc.getInputStream();
  78. os = tc.getOutputStream();
  79. //输入用户名和密码
  80. if (sendCommand(is, os, "\n").contains("login:")) {
  81. if (sendCommand(is, os, userName + "\n").contains("assword:")) {
  82. if (sendCommand(is, os, password + "\n").contains(
  83. "incorrect")) {
  84. throw new Exception("Auth error");
  85. }
  86. }
  87. }
  88. String[] result = new String[cmds.length];
  89. for (int i = 0; i < cmds.length; i++) {
  90. result[i] = sendCommand(is, os, cmds[i]);
  91. }
  92. return result;
  93. } catch (SocketTimeoutException e) {
  94. throw new Exception("SocketTimeoutException error");
  95. } catch (Exception e) {
  96. throw e;
  97. } finally {
  98. try {
  99. is.close();
  100. } catch (Exception e) {
  101. }
  102. try {
  103. os.close();
  104. } catch (Exception e) {
  105. }
  106. try {
  107. tc.disconnect();
  108. } catch (IOException e) {
  109. }
  110. }
  111. }
  112. /**
  113. * 执行Shell命令,并获取执行结果
  114. *
  115. * @param is
  116. * @param os
  117. * @param cmd
  118. * @return
  119. * @throws IOException
  120. */
  121. private static String sendCommand(InputStream is, OutputStream os,
  122. String cmd) throws IOException {
  123. os.write(cmd.getBytes());
  124. os.flush();
  125. StringBuffer sb = new StringBuffer();
  126. int beat = 0;
  127. while (true) {
  128. if (beat > 3) {
  129. break;
  130. }
  131. if (is.available() > 0) {
  132. byte[] b = new byte[is.available()];
  133. is.read(b);
  134. sb.append(new String(b));
  135. beat = 0;
  136. } else {
  137. if (sb.length() > 0) {
  138. beat++;
  139. }
  140. try {
  141. Thread.sleep(sb.toString().trim().length() == 0 ? 1000
  142. : 300);
  143. } catch (InterruptedException e) {
  144. }
  145. }
  146. }
  147. return sb.toString();
  148. }
  149. }


























【Telnet】使用Telnet协议连接到远程Shell执行脚本的更多相关文章

  1. 【Jsch】使用SSH协议连接到远程Shell执行脚本

    如果大家熟悉Linux的话,一定对ssh,sftp,scp等命令非常熟悉,ssh是一个安全协议,用来在不同系统或者服务器之间进行安全连接,SSH 在连接和传送的过程中会加密所有的数据. 但是SSH一般 ...

  2. linux-ssh远程后台执行脚本-放置后台执行问题(转)

    写了一个监控负载的小脚本(死循环,测试结束后再kill对应进程),因需要监控多台服务器,所以在一台服务器上使用ssh统一执行脚本遇到问题:使用ssh root@172.16.146.20 '/usr/ ...

  3. 一步一步学Python(2) 连接多台主机执行脚本

    最近在客户现场,每日都需要巡检大量主机系统的备库信息.如果一台台执行,时间浪费的就太冤枉了. 参考同事之前写的一个python脚本,配合各主机上写好的shell检查脚本,实现一次操作得到所有巡检结果. ...

  4. linux集群自动化搭建(生成密钥对+分发公钥+远程批量执行脚本)

    之前介绍过ansible的使用,通过ssh授权批量控制服务器集群 但是生成密钥和分发公钥的时候都是需要确认密码的,这一步也是可以自动化的,利用ssh + expect + scp就可以实现,其实只用这 ...

  5. shell脚本学习—Shell执行脚本

    Shell作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行这一条,这种方式称为交互式,但还有另一种执行命令的方式称为批处理方式,用户事先写一个Shell脚本,Shell可以一次把这些命 ...

  6. Shell执行脚本

    Shell作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行这一条,这种方式称为交互式,但还有另一种执行命令的方式称为批处理方式,用户事先写一个Shell脚本,Shell可以一次把这些命 ...

  7. python模拟shell执行脚本

    工作时候需要模拟shell来执行任务,借助包paramkio import paramiko class ShellExec(object): host = '127.0.0.1' port = 36 ...

  8. 通过Socket让远程电脑执行脚本

    实现功能: 客户端发送命令,服务器接收命令并执行 服务端: import socketserver, os class MyTCPHandler(socketserver.BaseRequestHan ...

  9. 简单shell执行脚本

    #!/bin/bash source /etc/profile APPLICATIONS_HOME="/opt/cpic_analy" APPLICATION_NAME=" ...

随机推荐

  1. Shell 编写准则

    Shell 中备注符号: # 或者 " 作为Shell中的备注符号. 需要注意的是,首行的#!/bin/bash 不是注释 Shell 格式 首行输入  #!/bin/bash 中间输入运行 ...

  2. viewBox A-Z滚动样式

    效果图:       代码实现 (其中使用了ionic框架...) html 代码: <ion-content class='page-location'> <div class=' ...

  3. hdu1000,hdu1001,hdu1002,hdu1003

    hdu1000 仅仅是为了纪念 #include <cstdio> int main() { int a,b; while (scanf("%d%d",&a,& ...

  4. PHP乱码完美解决

    文章来源  http://www.lupaworld.com/forum.php?mod=viewthread&tid=148807 A.首先说下HTML中文乱码问题的解决方法. 比如有个in ...

  5. HDU 1710

    http://acm.hdu.edu.cn/showproblem.php?pid=1710 题意:给二叉树的先序遍历和中序遍历,确定后序遍历 解法:复习专业课找的一题,根据先序遍历和中序遍历建树,再 ...

  6. 【转】浅思OC的语言特性

    算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...

  7. iOS开发 首次启动显示用户引导,第二次启动直接进入App,UIScrollView,UIPageControl,NSUserDefaults

    首先创建一个引导图的控制器类 UserGuideViewController.h和UserGuideViewController.m #import <UIKit/UIKit.h> #im ...

  8. 通过HttpWebRequest请求与HttpWebResponse响应方式发布接口与访问接口

    一.API接口的编码 1.首页的页面代码: protected void Page_Load(object sender, EventArgs e) { /* * 请求路径:http://xxxx/i ...

  9. Centos6.5 gitlab安装使用

    公司从svn转到git做版本管理,我搜了一下网上git的服务器,包括gitosis,gitolite等.一开始我是用的是gitosis作为git服务器的,安装过程还算比较简单,整个服务使用python ...

  10. ionic 开发APP 安装配置详解以及 cordova 环境配置详细过程

    整个安装过程:     1. jdk 1.7.2   (http://www.oracle.com/technetwork/java/javase/downloads/index.html) 安装好之 ...