【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=" ...
随机推荐
- 常用类String的方法
String str="hello"; 1.与数组相关的方法 System.out.println(str.length()); System.out.println(str.ch ...
- 【Python】实现简单循环
# -*- coding:utf-8 -*- #猜数字游戏 lucky_num = 6 count = 0 while count < 3: input_num = int(raw_input( ...
- 使用Navicat修改SQLite数据库提示:no such collation sequence: LOCALIZED
今天在修改Android应用里用到的一个SQLite数据库文件,使用Navicat修改SQLite数据库提示:“no such collation sequence: LOCALIZED”错误,折腾了 ...
- Adobe Dreamweaver代码编辑
Adobe Dreamweaver 同义词 DW(Adobe Dreamweaver的缩写)一般指Adobe Dreamweaver Adobe Dreamweaver,简称“DW”,中文名称 &qu ...
- ajax登陆提示
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Con ...
- Qt线程(4) 降低线程占用CPU
问题描述: 一般将计算量大的处理过程单独放置到一个单独的线程处理,因此很有可能你的处理过程需要while(1)或类似的操作. 也因此很有可能造成线程在处理时计算机CPU占用过高的情况. 解决办法: 降 ...
- pdf转成图片
http://blog.csdn.net/wydhao123/article/details/51596028 jar commons-logging.jar. pdfbox-2.0.1.jar.fo ...
- 这里整理了基于java平台的常用资源
这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.t ...
- STM3210x建工程库函数版本
1.首先下载一个固件库,我下载的是stm32f10x_stdperiph_lib 3.5V版的 2.新建一个文件夹,可命名为"STM32建工程库函数版本" 3.在"STM ...
- 为windows应用程序提供托盘图标
1>包含头文件 #include "Shellapi.h" 2>相关结构体和函数: NOTIFYICONDATA WINSHELLAPI BOOL ...