runtime.exec()

 Process exec(String command)
          在单独的进程中执行指定的字符串命令。
 Process exec(String[] cmdarray)
          在单独的进程中执行指定命令和变量。
 Process exec(String[] cmdarray,
String[] envp)

          在指定环境的独立进程中执行指定命令和变量。
 Process exec(String[] cmdarray,
String[] envp,
File dir)

          在指定环境和工作目录的独立进程中执行指定的命令和变量。
 Process exec(String command, String[] envp)
          在指定环境的单独进程中执行指定的字符串命令。
 Process exec(String command, String[] envp, File dir)
          在有指定环境和工作目录的独立进程中执行指定的字符串命令。

dir 指定了新子进程的工作目录。如果 dir 为 null,那么子进程会继承当前进程的当前工作目录

waitFor导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止。如果已终止该子进程,此方法立即返回。如果没有终止该子进程,调用的线程将被阻塞,直到退出子进程,0 表示正常终止。

一些平台只为标准输入输出提供有限的缓存。错误的写子进程的输入流或者错误的都子进程的输出流都有可能造成子进程的阻塞,甚至是死锁。

getErrorStream得到错误信息

getInputStream   得到正常信息

Runtime.exec() 不等同于直接执行command line命令!

Runtime.exec()很有局限性,对有些命令不能直接把command line里的内容当作String参数传给exec().

比如重定向等命令。举个例子:

javap -l xxx > output.txt

这时要用到exec的第二种重载

把整个命令都当成/bin/sh的参数传入


linux下

Process p = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c","javap -l xxx > output.txt"});

windows下

Process p = Runtime.getRuntime().exec(new String[]{"cmd","/c","javap -l xxx > output.txt"});

linux执行shell脚本(带参数)

1

假设有一个shell脚本文件test.sh,有两个参数parm1,parm2,java调用的方法如下:
String[] cmd = {"/bin/sh","-c","test.sh parm1 parm2"};

Runtime.getRuntime().exec(cmd);

2.

不带参数

String PATH = "/XXXXX/a.sh";
        try {
            Process num = Runtime.getRuntime().exec(PATH);
        } catch (IOException e) {
            e.printStackTrace();
        }

带参数传入数组

String[] PATH = {"/XXXXX/a.sh","param1","param2"};
        try {
            Process num = Runtime.getRuntime().exec(PATH);
        } catch (IOException e) {
            e.printStackTrace();
        }

windows下代码(需转码)

package com.zxing.imgQRCode;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Runshell1 {

    public static void main(String[] args) {

        
        try {
           
        
           /* Process p = Runtime.getRuntime().exec(
                    "D:/Program Files/Wireshark/Wireshark.exe");*/
            Process p = Runtime.getRuntime().exec(
                    new String[]{"cmd","/c","dir"});
            p.waitFor();

            InputStreamReader in = new InputStreamReader(
                    p.getInputStream(),"GBK");
            BufferedReader br = new BufferedReader(in);
            String lineStr;

            while ((lineStr = br.readLine()) != null) {
                System.out.println(lineStr);
            }
        } catch (Exception e) {

            e.printStackTrace();
        }

    }
}

linux下代码

package com.zxing.imgQRCode;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Runshell1 {

    public static void main(String[] args) {

        
        try {
            Process p = Runtime.getRuntime().exec(
                    new String[] { "/bin/sh", "-c", "ls >test.txt"}, null, null);
        
            /*Process p = Runtime.getRuntime().exec(
                    "D:/Program Files/Wireshark/Wireshark.exe");*/
/*
            Process p = Runtime.getRuntime().exec(
                    new String[]{"cmd","/c","dir"});*/
            p.waitFor();

            InputStreamReader in = new InputStreamReader(
                    p.getInputStream());
            BufferedReader br = new BufferedReader(in);
            String lineStr;

            while ((lineStr = br.readLine()) != null) {
                System.out.println(lineStr);
            }
        } catch (Exception e) {

            e.printStackTrace();
        }

    }
}

Java执行带重定向或管道的shell命令的问题

http://www.linuxidc.com/Linux/2012-07/64526.htm

本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1700098

时间: 2024-11-03 02:24:38

runtime.exec()的相关文章

禁止JVM执行外部命令Runtime.exec -- 由Apache Commons Collections漏洞引发的思考

update: 2015-11-16 新版apache commons collections 3.2.2修复漏洞 新版本的apache commons collections默认禁止了不安全的一些转换类.可以通过升级来修复漏洞.参考release说明:https://commons.apache.org/proper/commons-collections/release_3_2_2.html Dubbo rpc远程代码执行的例子 update: 2015-11-13 重新思考了下这个漏洞,给

runtime-Android Runtime.exec(ping ipaddr)在我们的平台上ping不通

问题描述 Android Runtime.exec(ping ipaddr)在我们的平台上ping不通 1,Runtime.exec(ping ipaddr)在别的平台上(各种平板,手机)都能ping成功,不知道为什么在我们的开发平台上不能ping成功: 2,直接在我们平台的com端上敲ping www.baidu.com可以Ping成功: 3,跟踪了ping.c的代码,发现创建icmp_sock = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP )这个SOCK_

Java魔法堂:找外援的利器——Runtime.exec详解

一.前言  Java虽然五脏俱全但总有软肋,譬如获取CPU等硬件信息,当然我们可以通过JNI调用C/C++来获取,但对于对C/C++和Windows API不熟的码农是一系列复杂的学习和踩坑过程.那能不能通过简单一些.学习成本低一些的方式呢?答案是肯定的,在功能实现放在首位的情况下,借他山之石 是最简洁有力的做法.而 Runtime.exec方法 就为我们打开这么的一条路了.   二.认识 java.lang.Runtime.exec方法    作用:用于调用外部程序,并重定向外部程序的标准输入

java runtime.exec() 的编写详细介绍

那就首先说点Runtime类吧,他是一个与JVM运行时环境有关的类,这个类是Singleton的.我说几个自己觉得重要的地方. 1.Runtime.getRuntime()可以取得当前JVM的运行时环境,这也是在Java中唯一一个得到运行时环境的方法. 2.Runtime上其他大部分的方法都是实例方法,也就是说每次进行运行时调用时都要用到getRuntime方法. 3.Runtime中的exit方法是退出当前JVM的方法,估计也是唯一的一个吧,因为我看到System类中的exit实际上也是通过调

用runtime.exec执行sqldump命令,却不能正常备份数据库

问题描述 我在一个web项目下面用runtime.exec执行了sqldumo的命令来执行数据库,后面用>来指向了生成文件的位置,但是执行了以后却并没有备份.然后我读取了进程的输出流,发现输出流只有应当备份数据库的一部分.哪位大神帮我看一下?谢谢 解决方案 解决方案二:备份数据库一般可以使用数据库自带的维护任务启动啊..不需要自己写脚本的,麻烦

《Java安全编码标准》一2.8 IDS07-J不要向Runtime.exec()?方法传递非受信、未净化的数据

2.8 IDS07-J不要向Runtime.exec()?方法传递非受信.未净化的数据 外部程序通常被系统调用来完成某种需要的功能.这是一种重用的形式,也被认为是一种简单基于组件的软件工程方法.在应用没有净化非受信的输入并且在执行外部程序时使用这种数据,就会导致产生命令和参数注入漏洞. 每一个Java应用都有一个唯一的Runtime类的实例,通过它可以提供一个应用和应用运行环境的接口.当前的Runtime对象可以通过Runtime.getRuntime()方法获得.Runtime.getRunt

Runtime.exec与Process运行没结果是怎么回事儿呀?在XIAN等。

问题描述 下边是代码,晕死了,怎么回事儿呀,没有输出结果.我是在LINUX上运行的import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;public class test {public static void main(String[] args) {Process process=null;Runtime rt=R

Runtime.exec()调用psexec去远程执行dos命令问题

问题描述 本地和远程系统都是winxp使用Runtime.exec(),如果执行本地dos命令,dir操作成功,能够全部输出完整dir的命令结果但是如果执行的是远程主机的命令,dir操作仍然成功,但在输出目录信息时,只能输出一部分.个人分析:psexec通过某个socket与远程主机建立连接,并执行相关命令,而程序使用StreamGobbler去读取结果返回信息,但在没读完之前,这个socket就被关闭了,导致只能读到一部分.想请问各位有没有什么办法,在这个socket关闭前,把所有该命令的执行

关于 注册表 和 new Runtime().exec(“”) 的用法??????

问题描述 具体的功能就是打开已上线的QQ软件给指定的已添加为好友的Q号发送消息.Runtimert=Runtime.getRuntime();Stringqq=JOptionPane.showInputDidalog("请输入要发送的QQ");Processprocess=rt.exec("rundll32url.dll,FileProtocolHandlertencent://message/?uin="+qq+"&Site=im.qq.com&