介绍

本文介绍如何通过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. 利用Ajax+MSMQ(消息队列)+WebService实现服务器端向客户端的信息推送

    需求: 每当数据库有数据更新时,推送到客户端 软需求: 1.服务器资源有限,要求资源占用尽可能小: 2.项目可控,不许调用第三方不可信不稳定的方法. 已有事例: 1.58到家采用的方法是TCP的长连接 ...

  2. Blender2.5快捷键

    General--通用 ESC Stops ongoing operation--停止当前操作 TAB Toggles Edit/Object mode--切换编辑/物体模式 ZKEY Toggles ...

  3. 修改SharePoint 2013中item Created by 信息

    因为公司的系统有点小bug.额,要做点坏事,把系统没记上的东西偷偷补上去,但是item的created by变成了我(这怎么行,不能让别人知道我做了坏事,一定是隔壁小李干的! 懒得开visual st ...

  4. 用HTML和CSS实现WWDC 2015上的动画效果

    用HTML和CSS实现WWDC 2015上的动画效果 动画效果WWDC 2015   原文:https://cssanimation.rocks/wwdc15/ 译者:周晓楷(@Helkyle) 每年 ...

  5. 简单的URL解析

    简单的URL解析,直接举例说明了 function getUrl(){ //如果存在则取到来后面的参数,注意,?不需要取出,substring从1开始,否则取""; var qs ...

  6. Objective-C 中,atomic原子性一定是安全的吗?

    我们在学习OC的时候认为,atomic使用了原子性,保证了线程安全,事实真的是这样吗? nonatomic的内存管理语义是非原子性的,非原子性的操作本来就是线程不安全的,而atomic的操作是原子性的 ...

  7. delegate和protocol

    协议和代理对于一个新手来说确实不讨好理解,也有很多的iOS开发的老手对此是懂非懂的.网上的很多博文只是讲了怎么使用,并没有说的很明白.下面我谈一下我的理解. 1.你要先搞明白,协议和代理为什么会出现, ...

  8. Android驱动开发前的准备(一)

    Android系统移植与驱动开发概述 1.1 Android 系统架构 1.2 Android系统移植的主要工作 1.3 查看linux内核版本 1.4 linux内核版本号的定义规则 1.5 lin ...

  9. php面试题及答案

    1.用PHP打印出前一天的时间,格式是2006-5-10 22:21:21 <?php   //echo date('Y-m-d H:i:s',time()-60*60*24   echo da ...

  10. 给linux 授权一个可以远程登录的账户

    创建用户:grant all on *.* to '; 授权:flush privileges;