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);
	}
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java执行windows下cmd命令的方法

    本文实例讲述了java执行windows下cmd命令的方法.分享给大家供大家参考. 具体实现代码如下: 复制代码 代码如下: //获取运行时 Runtime rt = Runtime.getRuntime(); //获取进程 Process p = rt.exec(String[] cmdarray);//或者 Process p = rt.exec(String cmd); //如果p不为空,那么要清空 if(null!=p){destory p.destory(); p=null; } 例如

  • Windows系统中Java调用cmd命令及执行exe程序的方法

    Java调用cmd命令,并输出显示信息: package com.anxin.cmd.test; import java.io.BufferedReader; import java.io.InputStreamReader; public class Command { public static void main(String[] args) { try { Runtime rt = Runtime.getRuntime(); Process pr = rt.exec("cmd /c di

  • Java程序执行Cmd指令所遇问题记录及解决方案

    这篇是有关在编写Java程序执行Cmd指令时所遇到的问题记录,其中有一些是个人的理解,如有问题望不吝赐教,感谢❤ Windows 命令提示符(cmd.exe)是 Windows NT 下的一个用于运行 Windows 控制面板程序或某些 DOS 程序的shell程序 1.执行Cmd命令的两种方式 (1)RunTime.getRunTime().exec(多种重载方式) - 会得到一个Process对象通过其start()方法开启一个新进程以执行输入的指令. 这种方法就不多说了,最后这种形式还是用

  • Java执行cmd命令两种实现方法解析

    一般java在执行CMD命令时,通常是使用Runtime.getRuntime.exec(command)来执行的,这个方法有两种细节要注意: 1.一般执行方法,代码如下,这种方法有时执行exe时会卡在那里. //一般的执行方法,有时执行exe会卡在那 stmt要执行的命令 public static void executive(String stmt) throws IOException, InterruptedException { Runtime runtime = Runtime.g

  • java运行windows的cmd命令简单代码

    我也不知道这个叫什么,就是比如我要打开我电脑的计算机,可以直接在命令行输入"calc"就可以了.现在用让代码去执行. 复制代码 代码如下: public static void main(String[] args) throws IOException {          Runtime.getRuntime().exec("calc");      } 结果如图: 因为是校园网,平时睡觉的时候喜欢把360wifi插在电脑上开着wifi,然后上床上玩手机,完了不

  • 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 ja

  • java Runtime如何执行多条命令

    目录 java Runtime如何执行多条命令 Runtime.getRuntime().exec 执行多条 java Runtime如何执行多条命令 使用 && 分隔命令 public static void cmd() { String ls = " cd /home/ && dir "; Process process = null; String cmd = getOsCmd()+ ls; try { process = Runtime.getR

  • Linux 连续执行多条命令的方法(推荐)

    每条命令使用";"隔开,则无论前边的命令执行成功与否都会继续执行下一条命令 这里,故意将第二条命令中的echo多写了一个o,命令执行出错,但并不影响后续命令的执行 可以这么想,如果用分号来间隔命令,就相当于将命令分隔在了不同的行,无论前一行的命令成功或失败,都不影响下一行命令的执行. $ echo 1; echoo 2; echo 3; echo 4 1 -bash: echoo: command not found 3 4 若命令间使用"&&"隔开

  • 将java程序打成jar包在cmd命令行下执行的方法

    前言 大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个jar包的程序入口.本文将给大家介绍java程序打成jar包在cmd命令行下执行的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一.打包 二.修改配置文件是程序能够引用第三方jar包 1.新建一个文件夹,用来存储这个项目 ------------第三方jar包单独存在一个文件夹下面(这里放在了lib下面)(重点是lib要和weixin.jar同

  • Java中如何执行多条shell/bat命令

    java调用process执行命令 public class ShellUtil { public static String runShell (String shStr) throws Exception { Process process; process = Runtime.getRuntime().exec( new String[]{ "/bin/sh" , "-c" ,shStr}); process.waitFor(); BufferedReader

  • Python执行dos和Linux命令的方法详解

    在实际开发中,有时为了方便,可能需要执行dos命令或者Linux命令.比如说执行某些shell脚本,上传下载一些文件,执行adb命令等跨语言,加压包,解压包等跨操作系统的场景.这样能大大加强多个平台和操作系统之间的关联性. windows: 案例1:弹窗式执行dos命令(与打开cmd执行一模一样) # -*- coding: utf-8 -*- import os # 解决打印时,部分中文乱码问题 os.popen('chcp 65001') # 查看当前路径 command1 = "chdir

  • C/C++中一次性执行多个DOS命令的实现思路

    起因 最近给公司的一个系统写了个启动的脚本,但是领导说批处理这样的脚本太low了,要使用EXE来启动,未来还要使用加密工具对EXE进行加密. 好吧,我就在网上到处找bat转exe的工具,找了很久,都没有找到合适的,只有一个用winrar制作自解压包的方法还算可以,但是这玩意儿有两个坑爹的问题: 使用了自定义图标后,安装时会被360报告有木马: 用winrar制作的exe,其本质还是解压后执行,解压后的文件其实可以在系统临时目录下找到,因此以后想要加密其实很容易就会被破解: 所以最好的办法看来就是

  • 在python 中实现运行多条shell命令

    使用py时可能需要连续运行多条shell 命令 1. # coding: UTF-8 import sys reload(sys) sys.setdefaultencoding('utf8') import subprocess import os import commands #os.system('cmd1 && cmd2') cmd1 = "cd ../" cmd2 = "ls" cmd = cmd1 + " &&

  • Java如何执行cmd命令

    目录 Java执行cmd命令 Java执行cmd命令总结 解释一下参数 总结 Java执行cmd命令 //当前绝对路径 System.out.println(IoUtil.read(Runtime.getRuntime().exec("cmd /c echo %cd%").getInputStream(), Charset.forName("gbk"))); //创建文件夹 System.out.println(IoUtil.read(Runtime.getRunt

随机推荐