首页 > 系统相关 >Java调用Linux命令(cd的处理)

Java调用Linux命令(cd的处理)

时间:2023-01-04 14:44:31浏览次数:50  
标签:Java cmd cd Linux println new null proc out

一、Java调用Linux系统的命令非常简单

这是一个非常常用的调用方法示例:

复制代码
 1     public String executeLinuxCmd(String cmd) {
 2         System.out.println("got cmd job : " + cmd);
 3         Runtime run = Runtime.getRuntime();
 4         try {
 5             Process process = run.exec(cmd);
 6             InputStream in = process.getInputStream();
 7             BufferedReader bs = new BufferedReader(new InputStreamReader(in));
 8             // System.out.println("[check] now size \n"+bs.readLine());
         StringBuffer out = new StringBuffer();
         byte[] b = new byte[8192];
         for (int n; (n = in.read(b)) != -1;) {
           out.append(new String(b, 0, n));
        }
         System.out.println("job result [" + out.toString() + "]");
14             in.close();
15             // process.waitFor();
16             process.destroy();
17             return result;
18         } catch (IOException e) {
19             e.printStackTrace();
20         }
21         return null;
22     }
复制代码

 

二、含有管道符(|)多级命令串联查询

复制代码
public List<String> executeLinuxCmd(String cmd) {
        System.out.println("got cmd job : " + cmd);
        Runtime run = Runtime.getRuntime();
        try {
//            Process process = run.exec(cmd);
            Process process = run.exec(new String[] {"/bin/sh", "-c", cmd});
            InputStream in = process.getInputStream();
            BufferedReader bs = new BufferedReader(new InputStreamReader(in));
            List<String> list = new ArrayList<String>();
            String result = null;
            while ((result = bs.readLine()) != null) {
                System.out.println("job result [" + result + "]");
                list.add(result);
            }
            in.close();
            // process.waitFor();
            process.destroy();
            return list;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
复制代码

 

三、含有cd操作的方法示例

1. 问题背景

1.1 java程序运行在/home/lings目录下;

1.2 希望删除/home/test目录下的文件proxy.log;

1.3 调用上面的接口两次?

executeLinuxCmd("cd /home/test");
executeLinuxCmd("rm -fr /home/proxy.log");

是不行的!

1.4 这个接口的调用是单次事务型的,就是每次调用都是独立的事务或者说操作,没有关联的。

那这种“复杂”一点的操作流程怎么办呢?

1.5 方法a: 可以写一个独立的脚本,然后一次运行脚本,这样多复杂的逻辑都没问题。

1.6 方法b: 可以启动一个shell长连接,保持连接,发送多条命令,最后释放连接。

示例逻辑代码:

复制代码
 1 public void executeNewFlow() {
 2         Runtime run = Runtime.getRuntime();
 3         File wd = new File("/bin");
 4         System.out.println(wd);
 5         Process proc = null;
 6         try {
 7             proc = run.exec("/bin/bash", null, wd);
 8         } catch (IOException e) {
 9             e.printStackTrace();
10         }
11         if (proc != null) {
12             BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
13             PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
14             out.println("cd /home/test");
15             out.println("pwd");
16             out.println("rm -fr /home/proxy.log");
17             out.println("exit");//这个命令必须执行,否则in流不结束。
18             try {
19                 String line;
20                 while ((line = in.readLine()) != null) {
21                     System.out.println(line);
22                 }
23                 proc.waitFor();
24                 in.close();
25                 out.close();
26                 proc.destroy();
27             } catch (Exception e) {
28                 e.printStackTrace();
29             }
30         }
31     }
复制代码

 三的优化和演进(返回值)

复制代码
    public List<String> executeNewFlow(List<String> commands) {
        List<String> rspList = new ArrayList<String>();
        Runtime run = Runtime.getRuntime();
        try {
            Process proc = run.exec("/bin/bash", null, null);
            BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
            for (String line : commands) {
                out.println(line);
            }
            // out.println("cd /home/test");
            // out.println("pwd");
            // out.println("rm -fr /home/proxy.log");
            out.println("exit");// 这个命令必须执行,否则in流不结束。
            String rspLine = "";
            while ((rspLine = in.readLine()) != null) {
                System.out.println(rspLine);
                rspList.add(rspLine);
            }
            proc.waitFor();
            in.close();
            out.close();
            proc.destroy();
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return rspList;
    }
复制代码

标签:Java,cmd,cd,Linux,println,new,null,proc,out
From: https://www.cnblogs.com/kn-zheng/p/17024776.html

相关文章

  • [java] a simple Applet program
    //javacodefileimportjavax.swing.*;importjava.awt.*;importjava.awt.event.*;importjava.net.*;publicclassWelcomeAppletextendsJApplet{publicvoidinit()......
  • [java]Regular Expression Testor
    importjava.awt.Dimension;importjava.awt.GridBagConstraints;importjava.awt.GridBagLayout;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListene......
  • NET2272.C 代码分析——SetProcessorSpecificDefaultConfiguration
    section("L1_code")intSetProcessorSpecificDefaultConfiguration(ADI_NET2272_DEVICE*pDev){/*enableasyncbank3*/*pEBIU_AMGCTL|=0xF;ssync();/*defau......
  • Java线程生命周期
    java.lang.Thread类包含一个静态枚举,它定义了它的潜在状态。在任何给定的时间点内,线程只能处于以下状态之一:NEW–一个新创建的线程,尚未开始执行RUNNABLE–正在运行......
  • 第五阶段:Java Web 核心技术
    认清现实,放弃幻想。(特此感谢动力节点老杜分享出来的学习路线)5.第五阶段:JavaWeb核心技术5.1Tomcat与HTTP5.1.1学习目标1.掌握Tomcat服务器搭建2......
  • java spring jar包下载
    想学习一下javaspring,真是不知道怎么来着手。在网上查了一下eclipse里建spring工程的方法:1、创建Java项目转到 文件菜单- 新建- 项目- Java项目。输入项目名称,例如......
  • self hosted private support chat software use JavaScript remove HTML tags
    ThemainreasonforremovingHTMLtagsinonlinecustomerservicesystemsistopreventmalicioususersfromattackingthewebsiteorotherusersbyinputting......
  • 在线客服系统中javascript 源码实现除去html标签
    在线客服系统中除去HTML标签的主要原因是为了防止恶意用户通过输入恶意的HTML代码来攻击网站或其他用户。例如,如果你不过滤用户输入的HTML,一个恶意用户可能会输入下面这段......
  • 通过xshell在linux上安装nginx1.12.0
    0)环境安装Nginx是C语言开发,建议在Linux上运行,当然,也可以安装Windows版本,本篇则使用CentOS7作为安装环境。 0.1gcc安装安装nginx需要先将官网下载的源码进......
  • Java 合并PDF文件
    这篇文章主要介绍如何在Java应用程序中实现将多个PDF文件合并为一个PDF的功能。使用组件:Spire.PDFforJava使用以下代码前,需要下载​​Spire.PDFforJava​​包并解压,然后......