【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=" ...
随机推荐
- 如何在Form++开源组态平台添加硬件采集接口
E-Form++是一套值得推荐的高品质开源C++矢量图形库,C++编程之所以异常困难,主要就是没有很专业的C++基础架构库有关.E-Form++的出现一定程度上填补了这个空白.是开发工控.监控.建模与 ...
- Orchard中的命令行工具
在Orchard中提供了一个命令行工具,我们可以使用这个命令行工具创建用户.创建博客.生成代码.配置网站.打包模块等.并且这个命令行工具是可以扩充的,只要我们在自己开发的模块中创建一个Command类 ...
- sudo apt-get install apache2 php7.0 php7.0-mysql mysql-server
sudo apt-get install apache2 php7.0 php7.0-mysql mysql-server sudo apt-get install libapache2-mod-ph ...
- htop基本使用
一.什么是htop? top是所有类unix系统的必备工具,能直观方便的查看到系统负载.内存及进程等信息. 而htop具有top工具的全部功能且还新增了一些额外的功能和使用体验改进.与top相比,其具 ...
- HDU 5113 dfs剪枝
题意:告诉格子规格,颜色个数,以及每个颜色能涂得格子数目,问是否能够实现相邻两个格子的颜色数目不相同. 分析:因为数据很小,格子最多是5 * 5大小的,因此可以dfs.TLE了一次之后开始剪枝,31m ...
- dynamic_cast 和 static_cast 隐式类型转换的区别
首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion ...
- linux进程命令
1. ps命令 命令 命令名称: 命令名称: ps 功能: 功能: 查询正在执行的进程 语法: 可选参数] 语法: ps [可选参数] 描述: 命令提供 命令提供Linux系统中正在发生的事情的 ...
- 判断IP地址的类型
#include <stdio.h> #include <stdlib.h> void main() { ]; int ip_addr; printf("请输入IP地 ...
- UIkit折腾
镜像命令: sudo npm install --registry=http://registry.npm.taobao.org/ --disturl=https://npm.taobao.org/d ...
- MSP430单片机的两种SPI总线实现方式
MSP430单片机上的SPI总线的实现方式分为两种:硬件实现和软件实现. 二者的抽象层次不同,硬件实现方式下程序员只需要完成总线协议的寄存器层,即一字节(char,8位二进制)数据,而软件实现方式下程 ...