好久没有写博客,今天在这里简单介绍一下我在做软件工程项目时使用Java Runtime.exec方法遇到的一些问题,希望加深大家对Runtime.exec方法的理解。
首先,大家都知道,Runtime.exec(String command)函数是用来执行命令行命令的,那么是不是我把写在命令行中的命令直接复制粘贴成参数就可以了呢?事实并非如此,我们要理解这个函数的使用,要从它的源码说起。
public Process exec(String command, String[] envp, File dir)
throws IOException {
if (command.length() == 0)
throw new IllegalArgumentException("Empty command");
StringTokenizer st = new StringTokenizer(command);
String[] cmdarray = new String[st.countTokens()];
for (int i = 0; st.hasMoreTokens(); i++)
cmdarray[i] = st.nextToken();
return exec(cmdarray, envp, dir);
看到上面这个函数,我们发现这个函数的执行最后归结为Runtime.exec(String[] cmdarray)的执行。那么,command是如何转化成cmdarray的呢?很简单,我们相当于执行了一个split(" ")函数,将其转化为了字符串数组,再执行。那么,这和我们直接写命令行命令有什么区别呢?写简单命令的时候,区别是不大的,但是当我们的命令变复杂的时候,就不是这么一回事了。
我们来看下面这个命令
String command = "docker exec 3ba171ece612 sh -c 'output/libJudgerSandbox.so --exe_path="+exe+" --input_path="+in+" --output_path="+out+" --error_path="+error+" --max_real_time="+timeLimit+" --max_memory="+memoryLimit+"'";
这个命令就很复杂了,简单来说,我们调起一个docker,在docker内部执行一个脚本命令,sh -c后面跟的就是要在dokcer内部执行的脚本命令。最开始的时候,我就是把这整个命令丢尽了exec函数,但是怎么执行都不成功,直到我看到了相关源码,我才明白,如果以空格为单位进行分割,我的上述代码当然是不可能被执行成功的。因此选择直接用String[] cmdarray的形式执行命令。
String command = "output/libJudgerSandbox.so --exe_path="+exe+" --input_path="+in+" --output_path="+out+" --error_path="+error+" --max_real_time="+timeLimit+" --max_memory="+memoryLimit;
String[] commands = {"docker","exec","3ba171ece612","sh","-c",command};
Process p = Runtime.getRuntime().exec(commands);
如此这一段命令便可以正确运行了。在正确运行之前,还遇到了一个小bug,按照sh -c的要求,后面的命令要放到单引号之间才能正确运行,但是在exec中,同年过cmdarry的形式,我们已经把后面的shell命令与前面的命令完全隔离开了,因此不需要加单引号。
好久没有写博客,今天在这里简单介绍一下我在做软件工程项目时使用Java Runtime.exec方法遇到的一些问题,希望加深大家对Runtime.exec方法的理解。首先,大家都知道,Runtime.exec(String command)函数是用来执行命令行命令的,那么是不是我把写在命令行中的命令直接复制粘贴成参数就可以了呢?事实并非如此,我们要理解这个函数的使用,要从它的源码说起。p...
Java Docker API Client. To start using docker-java , you need to add at least two dependencies. You will need an instance of DockerClientConfig to tell the library how to access Docker, which credentials to use to pull from Docker registries, etc. The builder is available and allows you to configure every property of the client. Should you need to customize the Jackson's ObjectMapper used by docker-java, you can create your own DockerClientConfig. Once you decided which transport to use, you wil
windows环境下IDEA java代码Runtime.getRuntime.exec中shell的执行环境的解决方案前言解决办法后记
在使用IDEA本地开发监控守护线程的后台,我遇上了执行环境不兼容的问题,爆出各种“xxx不是内部或外部命令,也不是可运行的程序或批处理文件。”,简而言之就是Windows下的CMD默认不识别shell环境下的诸如sh、ssh、cat等命令。这个小demo很小,但是因为公司架构要求前后端分离+docker容器部署,所以这其中的坑还是不少的,执行环境不兼容就是其中额问题之一。
下载Git Bash进行安装,安装Git Bash是为了方便我们能在w
1. Runtime简介
每个Java应用程序都有一个Runtime类的Runtime ,允许应用程序与运行应用程序的环境进行接口。 当前运行时可以从getRuntime方法获得。应用程序无法创建自己的此类的实例。
两点说明:
无法自己创建Runtime对象,只能通过 Runtime getRuntime() 获取当前程序关联的运行时对象;
发布在同一个tomcat下的多个应用共享同一个 Runtime。
exec(String[] cmdarray, String[] envp, File dir)
Executes the specified command and arguments in a separate process with the specified environment and working directory.
try {
// 这种输出到某个文件的,必须按照如下格式,不能单独直接 exec 指令
String[] cmd = {"system/bin/sh", "-c", "logcat > /sdcard/logcat.txt"};
logcatProc = Runti...
Scripts not permitted to use method groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object (org.jenkinsci.plugins.docker.workflow.Docker build java.util.LinkedHashMap org.codehaus.groovy.runtime.GStringImpl java.lang.String). Administrators can decide whether to approve or reject this signature.
这个错误是由于 Jenkins 的脚本安全配置导致的。默认情况下,Jenkins 限制了一些敏感方法的使用,以保护系统安全。在你的情况下,Jenkins 阻止了使用 `docker.build` 方法。
要解决这个问题,你可以执行以下操作之一:
1. 请求管理员批准:联系 Jenkins 管理员,并请求他们在 Jenkins 主页的 "Manage Jenkins" -> "In-process Script Approval" 中批准 `docker.build` 方法的使用。
2. 使用脚本安全插件:安装并配置 Jenkins 的 Script Security 插件。该插件允许你管理 Jenkins 脚本的安全策略。
- 在 Jenkins 主页,点击左侧导航栏的 "Manage Jenkins"。
- 在 "Manage Jenkins" 页面,点击 "Manage Plugins"。
- 切换到 "Available" 选项卡,并在搜索框中输入 "Script Security"。
- 找到 "Script Security" 插件,并勾选它。
- 点击页面底部的 "Install without restart" 按钮,等待插件安装完成。
- 安装完成后,点击左侧导航栏的 "Manage Jenkins",然后选择 "In-process Script Approval"。
- 在 "In-process Script Approval" 页面,你可以对被阻止的方法进行批准或拒绝。
请注意,脚本安全是为了保护系统安全,并防止恶意代码的执行。在使用脚本安全插件时,仔细审查脚本中使用的方法和操作,并确保只批准你信任的、合法的操作。
月月鸟鸟月月: