首页
学习
活动
专区
圈层
工具
发布
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【转】Java中Runtime.exec的一些事 

    因为exitValue方法是非阻塞的,在调用这个方法时外部命令并没有返回所以引起异常。阻塞形式的方法是waitFor,它会一直等待外部命令执行完毕,然后返回执行的结果。...这是为什么那? JDK文档中的解释:因为本地的系统对标准输入和输出所提供的缓冲池有效,所以错误的对标准输出快速的写入和从标准输入快速的读入都有可能造成子进程的锁,甚至死锁。...JDK仅仅说明为什么问题会发生,却并没有说明这个问题怎么解决。...Hello World这个输入重订向到一个文本文件中,但是这个文件并没有生成,jecho仅仅是将命令行中的参数输出到标准输出中,用户觉得可以像dos中重定向一样将输出重定向到一个文件中,但这并不能实现,...你必须用Runtime.exec()去执行程序 你不能象命令行一样使用Runtime.exec()。 9 问答 问:为什么Runtime.exec("ls")没有任何输出?

    3.4K20

    Process类详解

    创建的子进程没有自己的终端或控制台。...不正确地处理这些外部程序可能会导致一些意外的异常、DoS,及其他安全问题。 一个进程如果试图从一个空的输入流中读取输入,则会一直阻塞,直到为其提供输入。...因此,在调用这样的进程时,必须为其提供输入。 一个外部进程的输出可能会耗尽该进程输出流与错误流的缓冲区。当发生这种情况时,Java 程序可能会阻塞外部进程,同时阻碍Java程序与外部程序的继续运行。...,此时就可以用Runtime.getRuntime().exec()来调用,他会生成一个新的进程去运行调用的程序,waitFor()方法也有很明显的弊端,因为java程序给进程的输出流分配的缓冲区是很小的...,有时候当进程输出信息很大的时候回导致缓冲区被填满,如果不及时处理程序会阻塞,解决的方法就是处理缓冲区中的信息,开两个线程分别去处理标准输出流和错误输出流 Process process = Runtime.getRuntime

    2.2K20

    用java调用VS2010 debug生成的.exe文件

    这个需求本来很普通,就是个exec()函数的事,但是由于种种原因,vs2013编写的C++程序无法打包成一个可以单独执行的exe文件,这个exe放在工程目录下双击,是可以正常执行的,但是用java调用后出现了一个很奇怪的现象...工程目录是这样: 双击的结果是这样: 调用的代码如下: Process process= Runtime.getRuntime().exec("F:\\aa\\demo")...; aa是工程目录,之所以出现这样的问题,是因为exe无法单独执行,需要读取本目录下的一些文件,而上面的代码是用来调用一些可单独执行的exe文件,然后把代码修改成这样: Process process...= Runtime.getRuntime().exec("F:\\aa\\demo", null,new File("F:\\aa")); 问题解决了,只是一句话的事,但是被着一句话卡了一整天,这就是我为什么在题目上加上...debug生成的exe文件这句话,因为这时的exe文件无法单独执行。

    65720

    【Java报错已解决】error: subprocess-exited-with-error

    例如,如果要执行一个位于特定目录下的自定义脚本,但没有将该目录添加到PATH环境变量中,就会出现类似问题。...例如,在Linux系统中,如果ulimit设置的文件描述符数量过低,而子进程需要打开大量文件,就会出现问题。此外,权限问题也很关键,如果子进程尝试访问没有权限的文件或目录,也会被操作系统阻止而退出。...例如,如果Java程序没有正确地读取子进程的输出流,可能会导致子进程的输出缓冲区填满,进而阻塞子进程,最终导致其异常退出。...().exec("my_command"); // 尝试获取子进程的退出值,如果子进程异常退出,这里会抛出异常 int exitValue = process.exitValue...三、其他解决方法 使用替代的进程执行方式或库(如果适用): 考虑使用ProcessBuilder替代Runtime.getRuntime().exec():ProcessBuilder提供了更多的功能和更灵活的配置选项

    51900

    Java魔法堂:调用外部程序

    dir.txt"}); File workdir 用于设置当前工作目录,譬如我们需要执行位于D:\tools下的echo.exe程序,那么可以这样调用Process proc = r.exec("echo.exec...Windows下调用系统命令,像dir等命令是由cmd解析器解释执行的,因此若直接写"dir"则会被认为在当前工作目录下有一个"dir.exe"文件,那么当然会执行失败;在Linux下调用ls等是同样道理...String cmd = "/path/to/getipconfig.bat"; // 自己写的bat脚本文件,里面包含ipconfig /all命令。...(采用xcopy命令复制大量文件时将会出现该问题) 解决办法就是当前的Java程序不断读取缓冲池的内容,从而为腾出缓冲池的空间。...如: Runtime r = Runtime.getRuntime(); try{ Process proc = r.exec("cmd /c dir"); // 假设该操作为造成大量内容输出

    2.1K10

    java Runtime.exec()执行shellcmd命令:常见的几种陷阱与一种完善实现

    Runtime.getRuntime().exec()执行JVM之外的程序:常见的几种陷阱前言日常java开发中,有时需要通过java运行其它应用功程序,比如shell命令等。...jdk的Runtime类提供了这样的方法。首先来看Runtime类的文档, 从文档中可以看出,每个java程序只会有一个Runtime实例,显然这是一个单例模式。...java.lang.reflect.Method.invoke(Method.java:497)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)为什么会抛出...这是因为外部线程还没有结束,这个时候去获取退出码,exitValue()方法抛出了异常。看到这里读者可能会问,为什么这个方法不能阻塞到外部进程结束后再返回呢?...例如,下面的例子Process process = runtime.exec("java -version > a.txt");这样并不会产出a.txt文件。

    1.5K10

    Java调用Python的错误

    只可以这样使用: Runtime.getRuntime().exec(“python D:\studentdb.py 12345678 666666”); 这样是可以把学号和密码传入Python...之前也有注意到这个方法,但是由于考虑到它的复杂性,和Runtime.getRuntime().exec()方法的简单性,就没有往这里想,毕竟程序员是最懒的。...两种解决方法: (1)下载或pip install需要的第三方库,将jython.jar改成jython.zip,并解压缩,将下载的第三方库(以库名定义的文件夹)放到jython文件夹下的/Lib或/Lib.../site-packages下,最后将jython文件夹重新打包(注意:打包时不要直接对jython文件夹打包,只打包jython根目录下的所有文件),并改后缀为.jar,配置到java的工程目录中(构建路径...因为Python3要适配Python2的所有第三方包会花费很长的时间! 但是事物的发展不就是要走在最前沿的吗! 这个问题肯定有它的解决办法。只是我不知道和不会。

    2.3K20

    java 执行shell命令及日志收集避坑指南

    但总体来说的 ProcessBuilder 的可控性更强,所以一般使用这个会更自由些。   ...但如果你使用的系统调用,则不好处理了,因为每个系统支持的命令并非完全一样的,你的代码也就会因环境的不一样而表现不一致了。健壮性就下来了,所以,少用为好。     3. 内存是否够用?       ...而如果是同步调用的话,则当前线程必须等待进程退出,这样会让我们的业务大大简单化了。因为异步需要考虑的事情往往很多。     5. 如何获取进程日志信息?       ...一个shell进程的调用,可能是一个比较耗时的操作,此时应该是只要任何进度,就应该汇报出来,从而避免外部看起来一直没有响应,从而无法判定是死掉了还是在运行中。...它实际上并不能直接抛出异常,我们可以通过进程的返回码来判定是否发生了异常,这些错误码一般会遵循操作系统的错误定义规范,但时如果是我们自己写的shell或者其他同学写的shell就无法保证了。

    2.9K10

    代码审计 | 命令注入和代码注入

    1、示例 当命令可控时,就可能会导致命令注入,例如以下代码: String cmd = request.getParameter("cmd"); Runtime.getRuntime().exec(cmd...例如以下代码: Runtime.getRuntime().exec("ping " + url); 这里因为 URL 可控,因此当我们输入 127.0.0.1&ipconfig 时,拼接出来的系统命令就是...与命令注入相比,代码注入更具有灵活性,例如在 Apache Commons collections 反序列化漏洞中直接使用 Runtime.getRuntime().exec() 执行系统命令是无回显的...,但如果通过 URLLoader 远程加载类文件以及异常处理机制就可以构造出回显的利用方式。...com → commons」目录下创建 ApacheCommonsCollectionsDemo.java 文件(右击 com.commons 软件包选择:新建 → Java 类文件) 无回显利用 在

    1.8K20

    给你的系统增加对物理地址的验证

    给你的系统增加对物理地址的验证 我们开发出一个系统之后,经常有很多方法来保护我们的系统不受别人非法使用,比如说采用注册码,根据IP地址进行限制等。...,因为电脑的物理地址已经改变,所以原来所使用的注册码将失效,这样可以防止了系统的非法拷贝。...开发原理 其中这个原理比较简单,首先我们是根据用户提供的物理地址制作出一个license文件(或者是注册码,这个注册码是根据保护了物理地址的信息,不过最好是要先通过编码),就是通过系统的命令来获得电脑的物理地址...开发代码 首先,让我们先来看看如何获得命令的信息。在java中,有一个Runtime.getRuntime().exec()方法,这个方法可以执行一个系统命令,然后返回命令的相关信息。...在这里,我们采用路径的分隔符来判断,比如说,在windows系统下是采用“/”才分隔目录的,比如:c:/temp/doc,而linux和unix是用“/”来分隔的,比如:/mnt/doc,这样我们就可以判断了

    64520

    终极Java反序列化Payload缩小技术

    ExceptionTable和LocalVariableTable LineNumberTable 有JVM相关的知识可以得知,局部变量表和异常表是不能删除的,否则无法执行 但LineNumberTable...} catch (Exception e) { e.printStackTrace(); return new byte[]{}; } } 将动态生成的字节码保存至当前目录...缩小了51.1% 验证Payload有效可以弹出计算器 删除重写方法 可以发现Evil类继承自AbstractTranslet抽象类,所以必须重写两个transform方法 这样写代码会导致编译不通过,...因为实战中不是弹个计算器这么简单 因此可以用追加的方式发送多个请求往指定文件中写入字节码,将真正需要执行的字节码分块 使用Javassist动态生成写入每一分块的Payload,以追加的方式将所有字节码的...getDecoder().decode(data)); fos.close(); } catch (Exception ignored) { } } 会有师傅产生疑问:为什么要写这么多的代码而不用

    76310

    java调用外部应用程序

    最近因为需要做视频文件转换,在网上找了下,比较多的推荐是使用ffmpeg来实现,于是准备在java语言的基础上去实现,经过分析其实就是调用ffmpeg提供的应用命令去完成。...ffmpeg -i input.mp4 output.avi 在java中调用外部应用一般都会使用 Runtime.getRuntime().exec(); 以前其实也使用过,但是没有过深入的研究,在使用是发现也会有各种无法预料的问题出现...,简单的调用过程如下: Process p = Runtime.getRuntime().exec("ffmpeg -i .....回过头来看看,刚的exec方法,主要是三个参数: 命令以及参数 start dir;explore dir等 运行环境,解析${} 工作目录,按照我的理解应该相当于cmd中cd到的目录进行执行程序 那到底是什么原因导致无法找到...最后其实在ffmpeg命令前添加 cmd /c 即可,但是百度cmd /c 主要的作用是在执行脚本时保持关闭当前窗口。具体是什么原因导致这样的差别而引起程序运行的怪异现象?

    4K70

    探秘Java Runtime类:深入了解JVM运行时环境,有两下子!

    exec方法:exec方法接受一个字符串参数command,并返回一个Process对象,该对象表示执行指定命令创建的子进程。这个方法在示例中没有实现,需要进一步开发。...以下是对代码的逐行解析:导入java.io.IOException,这是使用Runtime.exec()方法可能抛出的异常之一。...注意事项:Runtime.exec(String command)方法执行的命令依赖于系统环境,可能在非Windows系统上不可用或需要不同的命令。...代码中的异常处理(throws IOException)表明调用exec方法可能抛出IOException,但在这段代码中没有捕获和处理这个异常。...实践中的注意事项  在实际使用中,我们需要注意Runtime类方法的异常处理,确保程序的健壮性。同时,对于exit()方法的使用要慎重,因为它将终止JVM的运行,可能会导致资源未能正确释放。

    84441

    App安全测试—Android安全测试规范

    避免使用MODE_PRIVATE模式创建内部存储文件,默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容。...B应用负责接收intent的组件,在解析intent数据时,会通过Intent的getXXXExtra()函数,如果解析为空数据、异常、或是畸形数据,就可能会导致程序崩溃。...msg = readCMDFromSocket(in) if ("exec" == msg) { //没有任何的socket命令校验 ......在源码中查找使用Runtime.getRuntime().exec执行第三方程序的代码样例: try { Process p1 = Runtime.getRuntime().exec...预期结果 合理使用Runtime.getRuntime().exec等函数,防止恶意调用。 整改建议 合理设置程序逻辑防止恶意调用,如果该行为是非期望行为,移除相关代码。

    6.2K42

    Java执行Shell命令的方式

    = Runtime.getRuntime().exec("ls /home");     BufferedReader reader=new BufferedReader(new InputStreamReader...    reader.close();  } catch (IOException e) {     e.printStackTrace();  } 该方法返回一个Process对象,该对象可以用于控制执行的命令或获取其输出信息...它可以接受一个字符串命令列表,可以更方便的设置环境变量和工作目录,代码示例: ProcessBuilder processBuilder = new ProcessBuilder("ls", "/home...类似于Runtime.exec方法,这个方法也会抛出IOException,所以也需要进行异常处理。 三、注意事项 在执行Shell命令时,需要注意命令执行环境的权限问题。...也就是说,Java运行的环境是否有权限执行指定的Shell命令,否则会抛出权限错误。 另外,如果Shell命令执行时间过长,可能会导致Java主线程阻塞等待。

    4.3K40
    领券