精华内容
下载资源
问答
  • 一.以springboot为例,建立代码1.IExecCommandServer:public interface IExecCommandServer {void execCommand(String cmd);}2.ExecCommandServerImp:@Servicepublic class ExecCommandServerImp implements ...

    一.以springboot为例,建立代码

    1.IExecCommandServer:

    public interface IExecCommandServer {

    void execCommand(String cmd);

    }

    2.ExecCommandServerImp:

    @Service

    public class ExecCommandServerImp implements IExecCommandServer {

    @Override

    public void execCommand(String cmd){

    try{

    Runtime rt = Runtime.getRuntime();

    Process proc = rt.exec(cmd,null,null);

    InputStream stderr = proc.getInputStream();

    InputStreamReader isr = new InputStreamReader(stderr,"GBK");

    BufferedReader br = new BufferedReader(isr);

    String line="";

    while ((line = br.readLine()) != null) {

    System.out.println(line);

    }

    }catch (Exception e){

    e.printStackTrace();

    }

    }

    }

    3.ExecCommandController:

    @CrossOrigin

    @RestController

    @RequestMapping("/linux")

    public class ExecCommandController {

    @Autowired

    private IExecCommandServer execCommandServer;

    @GetMapping("/exec")

    public ResultMap execCommand(String cmd) throws Exception {

    execCommandServer.execCommand(cmd);

    return Result.success("ok");

    }

    }

    二,执行示例

    http://192.168.142.222:8086/linux/exec?cmd=ls /mnt

    日志中输出:

    748fe6ca596052e2f413779bf3df9156.png

    展开全文
  • 我们可以使用Java来执行本地Shell命令甚至是远程主机上的Shell命令,并获取其标准输出、异常输出、执行结果码。 首先,访问远程主机需要加入一下maven支持: <dependency> <groupId>com.jcraft</...

    我们可以使用Java来执行本地Shell命令甚至是远程主机上的Shell命令,并获取其标准输出、异常输出、执行结果码。

    首先,访问远程主机需要加入一下maven支持:

    <dependency>
        <groupId>com.jcraft</groupId>
        <artifactId>jsch</artifactId>
        <version>0.1.55</version>
    </dependency>
    

    获取命令返回值所用的java bean类:

    public class ShellCmdResult {
        /** 异常输出 */
        private List<String> errorList;
    
        /** 标准输出 */
        private List<String> echoList;
    
        /** 执行结果码 */
        private int result;
    
        public ShellCmdResult() {
            this.echoList = new ArrayList<>();
            this.errorList = new ArrayList<>();
        }
    
        public List<String> getErrorList() {
            return errorList;
        }
    
        public void setErrorList(List<String> errorList) {
            this.errorList = errorList;
        }
    
        public List<String> getEchoList() {
            return echoList;
        }
    
        public void setEchoList(List<String> echoList) {
            this.echoList = echoList;
        }
    
        public int getResult() {
            return result;
        }
    
        public void setResult(int result) {
            this.result = result;
        }
    
        public void addEcho(String echo) {
            this.echoList.add(echo);
        }
    
        public void addError(String error) {
            this.errorList.add(error);
        }
    
        @Override
        public String toString() {
            return "ShellCmdResult{" +
                    "errorList=" + StringUtils.join(errorList, ", ") +
                    "], echoList=[" + StringUtils.join(echoList, ", ") +
                    "], result=" + result +
                    '}';
        }
    }
    

    然后就是逻辑代码了:

    import com.jcraft.jsch.ChannelExec;
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.JSchException;
    import com.jcraft.jsch.Session;
    import org.apache.commons.lang3.StringUtils;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.Properties;
    
    public class ShellCmdExecutor {
        private static final int SESSION_TIMEOUT = 10000;
        private static final int CHANNEL_TIMEOUT = 5000;
    
        /**
         * 执行远程主机上的shell命令.
         * 
         * @param host 远程主机名(或IP地址)
         * @param port 远程主机端口号
         * @param user 用户ID(远程主机登陆用)
         * @param password 密码(远程主机登陆用)
         * @param cmd 命令
         * @return ShellCmdResult
         * @throws JSchException
         * @throws IOException
         */
        public static ShellCmdResult exec(String host, int port, String user, String password, String cmd) throws JSchException, IOException {
            JSch jsch = new JSch();
            Session session = null;
            ChannelExec channelExec = null;
            try {
                Properties config = new Properties();
                config.put("StrictHostKeyChecking", "no");
                session = jsch.getSession(user, host, port);
                session.setConfig(config);
                session.setPassword(password);
                session.connect(SESSION_TIMEOUT);
    
                channelExec = (ChannelExec) session.openChannel("exec");
                channelExec.setCommand(cmd);
                channelExec.connect(CHANNEL_TIMEOUT);
    
                try (BufferedReader errorReader = new BufferedReader(new InputStreamReader(channelExec.getErrStream()));
                     BufferedReader echoReader = new BufferedReader(new InputStreamReader(channelExec.getInputStream()))) {
                    ShellCmdResult shellCmdResult = new ShellCmdResult();
                    String line = null;
                    while ((line = echoReader.readLine()) != null) {
                        shellCmdResult.addEcho(line);
                    }
                    while ((line = errorReader.readLine()) != null) {
                        shellCmdResult.addError(line);
                    }
                    int exitStatus = channelExec.getExitStatus();
                    shellCmdResult.setResult(exitStatus);
                    return shellCmdResult;
                }
            } finally {
                if (channelExec != null && channelExec.isConnected()) {
                    channelExec.disconnect();
                }
                if (session != null && session.isConnected()) {
                    session.disconnect();
                }
            }
    
        }
    
        /**
         * 执行本地Shell命令.
         * 
         * @param cmd 命令
         * @return ShellCmdResult
         * @throws IOException
         * @throws InterruptedException
         */
        public static ShellCmdResult exec(String cmd) throws IOException, InterruptedException {
            Runtime runtime = Runtime.getRuntime();
            Process process = runtime.exec(new String[]{"bash", "-c", cmd});
            try (BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
                 BufferedReader echoReader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
                ShellCmdResult shellCmdResult = new ShellCmdResult();
                String line = null;
                while ((line = echoReader.readLine()) != null) {
                    shellCmdResult.addEcho(line);
                }
                while ((line = errorReader.readLine()) != null) {
                    shellCmdResult.addError(line);
                }
                int exitStatus = process.waitFor();
                shellCmdResult.setResult(exitStatus);
                return shellCmdResult;
            }
        }
    }
    

    用法:

    public class Main {
        public static void main(String[] args) throws IOException, JSchException, InterruptedException {
            // 调用远程主机Shell命令
            String host = "192.168.0.142";
            int port = 22;
            String user = "root";
            String password = "12345";
            String cmd = "bash /tmp/test.sh";
            ShellCmdResult shellCmdResult = ShellCmdExecutor.exec(host, port, user, password, cmd);
            System.out.println(shellCmdResult);
    
    		// 调用本地Shell命令
            cmd = "bash /tmp/test.sh";
            shellCmdResult = ShellCmdExecutor.exec(cmd);
            System.out.println(shellCmdResult);
        }
    }
    
    展开全文
  • [java]代码库import java.io.File;.../*** 通过ProcessBuilder执行本地命令。此类用于创建操作系统进程。 获取本机的ip配置信息** 每个进程生成器管理这些进程属性: (1)命令 是一个字符串列表,它表示要调用的外...

    [java]代码库import java.io.File;

    import java.io.IOException;

    import java.io.InputStream;

    import java.util.Map;

    /**

    * 通过ProcessBuilder执行本地命令。此类用于创建操作系统进程。 获取本机的ip配置信息

    *

    * 每个进程生成器管理这些进程属性: (1)命令 是一个字符串列表,它表示要调用的外部程序文件及其参数(如果有) (2)环境 是从变量 到值

    * 的依赖于系统的映射。初始值是当前进程环境的一个副本. (3)工作目录。默认值是当前进程的当前工作目录,通常根据系统属性 user.dir 来命名.

    * (4)redirectErrorStream 属性。最初,此属性为 false, 意思是子进程的标准输出和错误输出被发送给两个独立的流, 这些流可以通过

    * Process.getInputStream() 和 Process.getErrorStream() 方法来访问。 如果将值设置为

    * true,标准错误将与标准输出合并。这使得关联错误消息和相应的输出变得更容易。 在此情况下,合并的数据可从

    * Process.getInputStream() 返回的流读取, 而从 Process.getErrorStream() 返回的流读取将直接到达文件尾。

    */

    public class UsingProcessBuilder {

    /**

    * 获取Windows系统下的网卡的MAC地址

    *

    * @return

    */

    public static String getPhysicalAddress() {

    Process p = null;

    try {

    // 执行ipconfig /all命令

    p = new ProcessBuilder("ipconfig", "/all").start();

    } catch (IOException e) {

    return "";

    }

    byte[] b = new byte[1024];

    int readbytes = -1;

    StringBuffer sb = new StringBuffer();

    // 读取进程输出值

    InputStream in = p.getInputStream();

    try {

    while ((readbytes = in.read(b)) != -1) {

    sb.append(new String(b, 0, readbytes));

    }

    } catch (IOException e1) {

    } finally {

    try {

    in.close();

    } catch (IOException e2) {

    }

    }

    return sb.toString();

    }

    /**

    * 执行自定义的一个命令,该命令放在C:/temp下,并且需要2个环境变量的支持。

    */

    public static boolean executeMyCommand() {

    // 创建系统进程创建器

    ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");

    // 获得进程的环境

    Map env = pb.environment();

    // 设置和去除环境变量

    env.put("VAR1", "myValue");

    env.remove("VAR0");

    env.put("VAR2", env.get("VAR1") + ";");

    // 切换工作目录

    pb.directory(new File("C:/temp"));

    try {

    // 得到进程实例

    Process p = pb.start();

    // 等待该进程执行完毕

    if (p.waitFor() != 0) {

    // 如果进程运行结果不为0,表示进程是错误退出的

    // 获得进程实例的错误输出

    InputStream error = p.getErrorStream();

    // do something

    }

    // 获得进程实例的标准输出

    InputStream sdin = p.getInputStream();

    } catch (IOException e) {

    } catch (InterruptedException e) {

    }

    return true;

    }

    public static void main(String[] args) {

    String address = UsingProcessBuilder.getPhysicalAddress();

    System.out.println(address);

    }

    }

    694748ed64b9390909c0d88230893790.png

    展开全文
  • shell脚本在处理文本及管理操作系统时强大且简单,将shell脚本结合到应用程序中则是一种快速实现的不错途径本文介绍使用java代码调用并执行shell我在 ~/bin/ 目录下写了jbossLogDelivery.sh,有两个功能{./...

    shell脚本在处理文本及管理操作系统时强大且简单,

    将shell脚本结合到应用程序中则是一种快速实现的不错途径

    本文介绍使用java代码调用并执行shell

    我在 ~/bin/ 目录下写了jbossLogDelivery.sh,有两个功能

    {./jbossLogDelivery.sh list} 作用是输出jboss现有的日志列表,

    {./jbossLogDelivery.sh get logName youmail@163.com} 作用是将指定的日志发送到指定的邮箱

    我在一个web程序中打算整合这个脚本,以达到通过http get来操作脚本。

    下面是核心代码

    //推荐使用ProcessBuilder来创建处理进程,参数cmds是一个String数组,

    //网上流行的一种方式是runtime.getprocess,我自己测试执行脚本时目录有问题

    //按照上述脚本,输出日志列表功能cmds的值为{"jbossLogDelivery.sh","list"}

    //提取日志功能的cmds的值为{"jbossLogDelivery.sh","get","logname","youmail@csair.com"}

    ProcessBuilder processBd=new ProcessBuilder(cmds);

    //切换到脚本所在目录

    processBd.directory(new File(scriptPath)); //scriptPath = “~/bin/”;

    //开始执行

    process = processBd.start();

    //执行结果

    int status = process.waitFor();

    //读取脚本的输出结果

    br = new BufferedReader(new InputStreamReader(process.getInputStream()));

    //处理结果

    String line = "";

    while ((line =br.readLine())!=null) {

    resList.add(line);

    }

    展开全文
  • 使用到Process和Runtime两个类,返回值通过Process类的getInputStream...import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.uti...
  • java调用shell

    2021-04-18 04:25:37
    java代码内调用shell命令:Runtime.getRuntime().exec(String[] command);// command 是一个三个元素数组 一:命令位置;二:-c表示先执行第一个参数;三:你的命令。Process process = null;try {process = Runtime....
  • publicclassShellUtil {publicString run(String cmd) {Runtime runtime=Runtime.getRuntime();StringBuffer b=newStringBuffer();BufferedReader br= null;String sys= System.getProperties().getProperty("os.na....
  • "-c", "your shell"组装一个List, 其实你一次如果执行多个命令,都可以统一放到那个“your shell”字符串中。 2、执行过程中输出流控制: 在执行过程中,我们肯定需要得到正常的执行结果,也需要知道出错的内容...
  • Java JSch 远程执行 Shell 命令

    万次阅读 2021-03-28 15:02:09
    项目需求,需要远程 ssh 登录到某个节点执行 shell 命令来完成任务。对于这种需求,如果不用 java 程序,直接 linux 的 ssh 命令就可以完成,但是在编码到程序中时需要相关的程序包来完成,本文主要介绍在 java 中...
  • 首先,Java操作本地命令或者Shell之类,使用什么API呢? 1、java.lang.ProcessBuilder 找到一个大神的博客 浅析ProcessBuilder https://blog.csdn.net/u013256816/article/details/54603910 ,博主竟然是...
  • packagecom.gosun.utils;importch.ethz.ssh2.ChannelCondition;importch.ethz.ssh2.Connection;importch.ethz.ssh2.Session;importch.ethz.ssh2.StreamGobbler;importjava.io....importjava.io.InputStream...
  • 文章目录命令执行Runtime.exec()ProcessBuilder.start()ProcessImpl与UNIXProcessRuntime.exec()命令执行漏洞完 命令执行 Runtime.exec() 在传入命令时,可以传入String和String[] String cmd1 = "/bin/sh -c whoami...
  • java模拟ssh执行shell命令我们通常是在shell上操作linux命令,有没有可以通过java代码连接到ssh服务器来进行shell命令的操作呢?事实告诉我们是可以的,下面我们看一下源代码。一、maven pom.xmlch.ethz....
  • Java具有使用Runtime.exec对本地程序调用进行重定向的能力,但是用重定向或者管道进行命令调用将会出错。解决这一问题的办法是通过命令shell运行命令。在Java中调用本地程序会破坏平台独立性规则,但是经常需要这么...
  • java调用shell脚本并传参private void invokeShell(String projectDirectory, String ipaOutputDirectory, String version, String appName) {try {//第一个参数是sh命令,第 二个参数是脚本,从第三个参数天始,是...
  • 文章目录场景:需求:方法:java调用本地shell脚本java通过ssh方式调用远程shell脚本安全注意 场景: 在linux服务器上有这样一个脚本文件 /home/xxxx/my_script/run_dev_job_etl_usermonitor_task_list.sh 需求: 在...
  • 1. java 执行shelljava 通过 Runtime.getRuntime().exec() 方法执行 shell 的命令或 脚本,exec()方法的参数可以是脚本的路径也可以是直接的 shell命令代码如下(此代码是存在问题的。完整代码请看2):/*** 执行shell*...
  • (一)编程实现以下功能,并利用 Hadoop 提供的 Shell 命令完成相同任务:(1) 向 HDFS 中上传任意文本文件,如果指定的文件在 HDFS 中已经存在,则由用户来指定是追加到原有文件末尾还是覆盖原有的文件;开启Hadoop:...
  • 省略 } } 从上面的代码可以知道,它在通过线程池创建了一个future实例,并且在其阻塞线程里开启了一个进程调用本地shell script指令去遍历所有过期文件,但是线程内并没有任何关闭进程实例的操作,同时经过询问该...
  • 转自:http://tivan.iteye.com/blog/1045518用java调用shell,使用Process p=Runtime.getRuntime().exec(String[] cmd);Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或...
  • 答:调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息.由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如...
  • Spring boot 调用 shell 命令 我们将“执行命令行”封装成一个Spring中的service,入参是命令,当执行顺利时返回标准输入流中的结果,当执行失败记录日志或抛出异常。 并使用线程池来用线程读取流中的数据。 /** * ...
  • 所有就想到编写一个脚本来部署不同的服务器前提条件:配置ssh免登陆如果不会的请参加我的另外一篇文章 http://blog.csdn.net/chenpy/article/details/30281515(1)命令行执行登录并且在目标服务器上执行命令sshuser@...
  • 在Web应用中,有时候会用到一些命令执行的函数,如php中system、exec、shell_exec等,当对用户输入的命令没有进行限制或者过滤不严导致用户可以执行任意命令时,就会造成命令执行漏洞。命令注入漏洞主要表现为以下两...
  • Java exec无法像这样运行shell命令.如果要运行shell命令,则需要显式调用shell;例如Process proc = run.exec(new String[]{"/bin/sh","-c","echo 5 | ./prog"});有关Java如何处理此问题的更多详细信息,请阅读exec...
  • 下面是在windows系统上,java获取本地ip的方法。贴代码: package com.herman.test;import java.net.Inet程序员都很懒,你懂的!最近在开发中,需要用到服务器的ip和mac信息。但是服务器是架设在l...
  • Java调用本地命令

    2021-02-12 12:42:55
    在Linux下执行shell命令: 下面演示了在Linux中执行shell命令pwd,并显示执行结果: /*** 执行Linux的shell命令并在console端输出结果 **/ public classCallShell {/***@throwsException*/ public static void main...
  • java调用shell脚本和命令-ProcessBuilder方式 在上一节中,我使用Runtime的方式,实现了对命令行和脚本文件的运行。最后我留下了一个小小的问题那就是这个InputStream和errorStream需要分开获取,那有没有其他方,...
  • 先上依赖 <!...https://mvnrepository.com/artifact/ch.ethz.ganymed/ganymed-ssh2 --> <dependency> <groupId>ch.ethz.ganymed</groupId> <artifactId>ganymed-ssh2</artifactId> <version>262</version> </dependency> 只能一次执行一行命令... import ch.ethz.ssh2.ChannelCondition; import ch.ethz.ssh2.Connection; import ch.ethz.ssh2.Session; import ch.ethz.ssh2.StreamGobbler; import org.junit.jupiter.api....
  • 现象:在使用java 调用 shell 解压rar 文件,当文件数量较少时,没有任何问题.一旦文件数量超过500,就会出现卡死等问题.public static String exec(String cmd) {String result = "";try {String[] shellCmd = new ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 68,293
精华内容 27,317
关键字:

java本地shell命令

java 订阅