java如何连续执行多条cmd命令
作者:薛8 发布时间:2023-07-13 13:10:41
标签:java,执行,cmd命令
java连续执行多条cmd命令
命令之间用&连接
例如:
Process p = Runtime.getRuntime().exec("cmd /c d: & cd bin/");
java ssh登录执行多条cmd命令
java登录ssh执行多条命令,解决出现more自动回车的问题
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UIKeyboardInteractive;
import com.jcraft.jsch.UserInfo;
public class JavaSsh implements Runnable {
protected Logger logger = LogManager.getLogger();
/**
* 退格
*/
private static final String BACKSPACE = new String(new byte[] { 8 });
/**
* ESC
*/
private static final String ESC = new String(new byte[] { 27 });
/**
* 空格
*/
private static final String BLANKSPACE = new String(new byte[] { 32 });
/**
* 回车
*/
private static final String ENTER = new String(new byte[] { 13 });
/**
* 某些设备回显数据中的控制字符
*/
private static final String[] PREFIX_STRS = { BACKSPACE + "+" + BLANKSPACE + "+" + BACKSPACE + "+",
"(" + ESC + "\\[\\d+[A-Z]" + BLANKSPACE + "*)+" };
private int sleepTime = 200;
/**
* 连接超时(单次命令总耗时)
*/
private int timeout = 4000;
/**
* 保存当前命令的回显信息
*/
protected StringBuffer currEcho;
/**
* 保存所有的回显信息
*/
protected StringBuffer totalEcho;
private String ip;
private int port;
private String endEcho = "#,?,>,:";
private String moreEcho = "---- More ----";
private String moreCmd = BLANKSPACE;
private JSch jsch = null;
private Session session;
private Channel channel;
@Override
public void run() {
InputStream is;
try {
is = channel.getInputStream();
String echo = readOneEcho(is);
while (echo != null) {
currEcho.append(echo);
String[] lineStr = echo.split("\\n");
if (lineStr != null && lineStr.length > 0) {
String lastLineStr = lineStr[lineStr.length - 1];
if (lastLineStr != null && lastLineStr.indexOf(moreEcho) > 0) {
totalEcho.append(echo.replace(lastLineStr, ""));
} else {
totalEcho.append(echo);
}
}
echo = readOneEcho(is);
}
} catch (IOException e) {
e.printStackTrace();
}
}
protected String readOneEcho(InputStream instr) {
byte[] buff = new byte[1024];
int ret_read = 0;
try {
ret_read = instr.read(buff);
} catch (IOException e) {
return null;
}
if (ret_read > 0) {
String result = new String(buff, 0, ret_read);
for (String PREFIX_STR : PREFIX_STRS) {
result = result.replaceFirst(PREFIX_STR, "");
}
try {
return new String(result.getBytes(), "GBK");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
} else {
return null;
}
}
public JavaSsh(String ip, int port, String endEcho, String moreEcho) {
this.ip = ip;
this.port = port;
if (endEcho != null) {
this.endEcho = endEcho;
}
if (moreEcho != null) {
this.moreEcho = moreEcho;
}
totalEcho = new StringBuffer();
currEcho = new StringBuffer();
}
private void close() {
if (session != null) {
session.disconnect();
}
if (channel != null) {
channel.disconnect();
}
}
private boolean login(String[] cmds) {
String user = cmds[0];
String passWord = cmds[1];
jsch = new JSch();
try {
session = jsch.getSession(user, this.ip, this.port);
session.setPassword(passWord);
UserInfo ui = new SSHUserInfo() {
public void showMessage(String message) {
}
public boolean promptYesNo(String message) {
return true;
}
};
session.setUserInfo(ui);
session.connect(30000);
channel = session.openChannel("shell");
channel.connect(3000);
new Thread(this).start();
try {
Thread.sleep(sleepTime);
} catch (Exception e) {
}
return true;
} catch (JSchException e) {
return false;
}
}
protected void sendCommand(String command, boolean sendEnter) {
try {
OutputStream os = channel.getOutputStream();
os.write(command.getBytes());
os.flush();
if (sendEnter) {
currEcho = new StringBuffer();
os.write(ENTER.getBytes());
os.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
protected boolean containsEchoEnd(String echo) {
boolean contains = false;
if (endEcho == null || endEcho.trim().equals("")) {
return contains;
}
String[] eds = endEcho.split(",");
for (String ed : eds) {
if (echo.trim().endsWith(ed)) {
contains = true;
break;
}
}
return contains;
}
private String runCommand(String command, boolean ifEnter) {
currEcho = new StringBuffer();
sendCommand(command, ifEnter);
int time = 0;
if (endEcho == null || endEcho.equals("")) {
while (currEcho.toString().equals("")) {
try {
Thread.sleep(sleepTime);
time += sleepTime;
if (time >= timeout) {
break;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} else {
while (!containsEchoEnd(currEcho.toString())) {
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
time += sleepTime;
if (time >= timeout) {
break;
}
String[] lineStrs = currEcho.toString().split("\\n");
if (lineStrs != null && lineStrs.length > 0) {
if (moreEcho != null && lineStrs[lineStrs.length - 1] != null
&& lineStrs[lineStrs.length - 1].contains(moreEcho)) {
sendCommand(moreCmd, false);
currEcho.append("\n");
time = 0;
continue;
}
}
}
}
return currEcho.toString();
}
private String batchCommand(String[] cmds, int[] othernEenterCmds) {
StringBuffer sb = new StringBuffer();
for (int i = 2; i < cmds.length; i++) {
String cmd = cmds[i];
if (cmd.equals("")) {
continue;
}
boolean ifInputEnter = false;
if (othernEenterCmds != null) {
for (int c : othernEenterCmds) {
if (c == i) {
ifInputEnter = true;
break;
}
}
}
cmd += (char) 10;
String resultEcho = runCommand(cmd, ifInputEnter);
sb.append(resultEcho);
}
close();
return totalEcho.toString();
}
public String executive(String[] cmds, int[] othernEenterCmds) {
if (cmds == null || cmds.length < 3) {
logger.error("{} ssh cmds is null", this.ip);
return null;
}
if (login(cmds)) {
return batchCommand(cmds, othernEenterCmds);
}
logger.error("{} ssh login error", this.ip);
return null;
}
private abstract class SSHUserInfo implements UserInfo, UIKeyboardInteractive {
public String getPassword() {
return null;
}
public boolean promptYesNo(String str) {
return true;
}
public String getPassphrase() {
return null;
}
public boolean promptPassphrase(String message) {
return true;
}
public boolean promptPassword(String message) {
return true;
}
public void showMessage(String message) {
}
public String[] promptKeyboardInteractive(String destination, String name, String instruction, String[] prompt,
boolean[] echo) {
return null;
}
}
public static void main(String[] args) {
String ip = "192.168.0.238";
int port = 22;
JavaSsh JavaSsh2 = new JavaSsh(ip, port, null, null);
String username = "ssh";
String password = "yzfar.com";
String[] cmds = { username, password, "display mac-address", "display mac-address" };
String executive = JavaSsh2.executive(cmds, null);
System.out.println(executive);
}
}
来源:https://blog.csdn.net/xueba8/article/details/78945954


猜你喜欢
- C# 的类型系统可分为两种类型,一是值类型,一是引用类型,这个每个C#程序员都了解。还有托管堆,栈,ref,out等等概念也是每个C#程序员
- 最近做了一个MyEclipse项目,但是没开始多久就发现了这个问题:只要文件被修改过,不论多小的修改,保存的时候都会跳出一个框框,里面写着t
- Maven导入thymeleaf依赖飘红1、运行环境操作系统:win10jdk版本:1.8idea版本:2020.1maven版本:3.3.
- 讲这个例子前,咱们先来看一个简单的程序:字符串数组实现数字转字母:#include <stdio.h>#include <
- 模仿网易新闻客户端阅读偏好的频道选择,先看实现的页面: 直接上代码:import android.content.res.Resources
- 需要实现看门狗功能,定时检测另外一个程序是否在运行,使用 crontab 仅可以实现检测程序是否正在运行,无法做到扩展,如:手动重启、程序升
- 其实我觉得最主要还是开发者对于应用的优化不够,太多的Overdraw和Layout方面的问题,Android开发者本身为了适配屏幕分辨率和解
- 废话不多说,直接上代码package com.ietree.basicskill.socket.basic.nio;import java.
- 本文实例为大家分享了Flutter实现底部导航栏的具体代码,供大家参考,具体内容如下效果实现先将自动生成的main.dart里面的代码删除,
- 注:由于工作需要, 也是第一次接触到打印机的相关内容, 凑巧, 通过找了很多资料和帮助后, 也顺利的解决了打印标签的问题(标签的表面信息[二
- Tomcat启动报异常java.lang.ClassNotFoundExceptionTomcat启动报异常:java.lang.Class
- 解决方法:补充:idea中yml文件图标小绿叶变成小网格问题及自动提示失效解决方法idea中yml文件图标小绿叶变成小网格问题及自动提示失效
- 本文实例讲述了Android控件之CheckBox、RadioButton用法。分享给大家供大家参考。具体如下:CheckBox和Radio
- aes 对称加密密钥必须是32字节using System;using System.Security.Cryptography;using
- 一、新时间日期API常用、重要对象介绍ZoneId: 时区ID,用来确定Instant和LocalDateTime互相转换的规则Instan
- 在java项目开发过程中,使用properties文件作为配置基本上是必不可少的,很多如系统配置信息,文件上传配置信息等等都是以这种方式进行
- 一直写过数组全排列的算法,当时接触的是使用回溯的方法,这样可以保证生成的全排列一定是按照字典序的,但是今天在做leetcode上的一道题时,
- 本文实例为大家分享了java实现拼图游戏的具体代码,供大家参考,具体内容如下游戏说明:设计一款拼图游戏,要求点击图片按钮,实现图片按钮的移动
- 前言在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似ke
- 本文实例为大家分享了Android实战闹钟项目的具体代码,供大家参考,具体内容如下一、闹钟功能的介绍以及界面的展示该闹钟是根据我们手机闹钟设