【Telnet】使用Telnet协议连接到远程Shell执行脚本
介绍
maven仓库
<dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.4</version></dependency>
- 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连接等;
程序

完整程序
package com.sssppp.Communication;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.InetAddress;import java.net.SocketTimeoutException;import org.apache.commons.net.telnet.EchoOptionHandler;import org.apache.commons.net.telnet.SuppressGAOptionHandler;import org.apache.commons.net.telnet.TelnetClient;import org.apache.commons.net.telnet.TerminalTypeOptionHandler;public class TelentCommUtil {/*** 测试程序** @param args*/public static void main(String[] args) {String ip = "10.180.137.221";int port = 23;String localIp = null;int localPort = 0;int timeOut = 3000;String userName = "xxxxx";String password = "xxxxx";String[] cmds = new String[] { "ifconfig | grep eth0\n","cat /etc/redhat-release\n" };String[] result = null;try {result = execShellCmdByTelnet(ip, port, localIp, localPort, timeOut,userName, password, cmds);} catch (Exception e) {e.printStackTrace();}if (result != null) {for (String string : result) {System.out.println(string);System.out.println("-------------------");}}}/*** 使用Telnet协议,连接到Linux Shell,执行脚本命令,并获取结果** @param dstIp* @param dstPort* @param localIp* @param localPort* @param timeOut* @param userName* @param password* @param cmds* @return* @throws Exception*/public static String[] execShellCmdByTelnet(String dstIp, int dstPort,String localIp, int localPort, int timeOut, String userName,String password, String... cmds) throws Exception {TelnetClient tc = new TelnetClient();InputStream is = null;OutputStream os = null;try {//设置:RFC 1091 TELNET终端类型选项tc.addOptionHandler(new TerminalTypeOptionHandler("VT100", false,false, true, false));//设置:RFC 857 TELNET ECHO 回显选项tc.addOptionHandler(new EchoOptionHandler(true, false, true, false));//设置:RFC 858 TELNET SUPPRESS GO AHEAD(抑制继续进行)选项tc.addOptionHandler(new SuppressGAOptionHandler(true, true, true,true));tc.setConnectTimeout(timeOut);if (localIp == null) {tc.connect(dstIp, dstPort);} else {tc.connect(InetAddress.getByName(dstIp), dstPort,InetAddress.getByName(localIp), localPort);}is = tc.getInputStream();os = tc.getOutputStream();//输入用户名和密码if (sendCommand(is, os, "\n").contains("login:")) {if (sendCommand(is, os, userName + "\n").contains("assword:")) {if (sendCommand(is, os, password + "\n").contains("incorrect")) {throw new Exception("Auth error");}}}String[] result = new String[cmds.length];for (int i = 0; i < cmds.length; i++) {result[i] = sendCommand(is, os, cmds[i]);}return result;} catch (SocketTimeoutException e) {throw new Exception("SocketTimeoutException error");} catch (Exception e) {throw e;} finally {try {is.close();} catch (Exception e) {}try {os.close();} catch (Exception e) {}try {tc.disconnect();} catch (IOException e) {}}}/*** 执行Shell命令,并获取执行结果** @param is* @param os* @param cmd* @return* @throws IOException*/private static String sendCommand(InputStream is, OutputStream os,String cmd) throws IOException {os.write(cmd.getBytes());os.flush();StringBuffer sb = new StringBuffer();int beat = 0;while (true) {if (beat > 3) {break;}if (is.available() > 0) {byte[] b = new byte[is.available()];is.read(b);sb.append(new String(b));beat = 0;} else {if (sb.length() > 0) {beat++;}try {Thread.sleep(sb.toString().trim().length() == 0 ? 1000: 300);} catch (InterruptedException e) {}}}return sb.toString();}}
【Telnet】使用Telnet协议连接到远程Shell执行脚本的更多相关文章
- 【Jsch】使用SSH协议连接到远程Shell执行脚本
如果大家熟悉Linux的话,一定对ssh,sftp,scp等命令非常熟悉,ssh是一个安全协议,用来在不同系统或者服务器之间进行安全连接,SSH 在连接和传送的过程中会加密所有的数据. 但是SSH一般 ...
- linux-ssh远程后台执行脚本-放置后台执行问题(转)
写了一个监控负载的小脚本(死循环,测试结束后再kill对应进程),因需要监控多台服务器,所以在一台服务器上使用ssh统一执行脚本遇到问题:使用ssh root@172.16.146.20 '/usr/ ...
- 一步一步学Python(2) 连接多台主机执行脚本
最近在客户现场,每日都需要巡检大量主机系统的备库信息.如果一台台执行,时间浪费的就太冤枉了. 参考同事之前写的一个python脚本,配合各主机上写好的shell检查脚本,实现一次操作得到所有巡检结果. ...
- linux集群自动化搭建(生成密钥对+分发公钥+远程批量执行脚本)
之前介绍过ansible的使用,通过ssh授权批量控制服务器集群 但是生成密钥和分发公钥的时候都是需要确认密码的,这一步也是可以自动化的,利用ssh + expect + scp就可以实现,其实只用这 ...
- shell脚本学习—Shell执行脚本
Shell作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行这一条,这种方式称为交互式,但还有另一种执行命令的方式称为批处理方式,用户事先写一个Shell脚本,Shell可以一次把这些命 ...
- Shell执行脚本
Shell作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行这一条,这种方式称为交互式,但还有另一种执行命令的方式称为批处理方式,用户事先写一个Shell脚本,Shell可以一次把这些命 ...
- python模拟shell执行脚本
工作时候需要模拟shell来执行任务,借助包paramkio import paramiko class ShellExec(object): host = '127.0.0.1' port = 36 ...
- 通过Socket让远程电脑执行脚本
实现功能: 客户端发送命令,服务器接收命令并执行 服务端: import socketserver, os class MyTCPHandler(socketserver.BaseRequestHan ...
- 简单shell执行脚本
#!/bin/bash source /etc/profile APPLICATIONS_HOME="/opt/cpic_analy" APPLICATION_NAME=" ...
随机推荐
- HDU 5113 dfs剪枝
题意:告诉格子规格,颜色个数,以及每个颜色能涂得格子数目,问是否能够实现相邻两个格子的颜色数目不相同. 分析:因为数据很小,格子最多是5 * 5大小的,因此可以dfs.TLE了一次之后开始剪枝,31m ...
- array_unshift() 、
定义和用法 array_unshift() 函数在数组开头插入一个或多个元素. 被加上的元素作为一个整体添加,这些元素在数组中的顺序和在参数中的顺序一样. 该函数会返回数组中元素的个数. 语法 arr ...
- android view:布局优化
今天在图书馆看了一个android性能优化. 关于布局优化有几个小技巧: 1.尽量减少布局的嵌套,而使用相对布局,这样的话会减少布局对象的创建,并且可以再事件传递的时候减少传递嵌套. 2.使用incl ...
- Hbuilder与svn快速连接并在手机上测试页面
大家好,今天讲一下Hbuilder怎样与svn连接在一起,并且在移动端上面做真是的页面测试. 1,打开Hbuilder软件,在工具中,安装插件,找到svn插件安装. 2.点击文件,导入,从svn中检测 ...
- ThinkPHP BASE
对于thinkphp 开源框架来说 是一个基于 模型/控制器/视图 的结构 V(View):视图接收来自用户操作的信息返回到 对应的控制器或方法 C (controller):控制器则调用 相 ...
- ajax 选项卡
Ajax其实就是交互式网页应用开发技术包括以下几个方面: 1.XHTML和CSS 2.使用DOM作为动态显示和交互 3.使用XML和XSLT 做数据交互和操作 (这些完全不太懂) 4.使用XMLHtt ...
- HTML5,jQuery,ajax基础面试
简要描述HTML5中的本地存储 答案: 很多时候我们会存储用户本地信息到电脑上,例如:比方说用户有一个填充了一半的长表格,然后突然网络连接断开了,这样用户希望你能存储这些信息到本地,当网络回复的时候, ...
- CoreData数据库
一 CoreData 了解 1 CoreData 数据持久化框架是 Cocoa API 的一部分,首先在iOSS5 版本的系统中出现: 它允许按照 实体-属性-值 模式组织数据: ...
- 第五章——搭建S3C6410开发板的测试环境
搭建S3C6410开发板的测试环境 通过本章的学习学会了如何在开发板上安装Android.开发板是学习和开发嵌入式技术的主要硬件设备,想要顺利的通过linux驱动访问硬件,是不能在PC板上模拟的,需要 ...
- Python数学函数
1.Python数学函数 1.abs(x):取绝对值,内建函数 2.math.ceil(x):向上取整,在math模块中 3.cmp(x,y):如果 x < y ,返回-1:如果 x == y ...