我开发了一个Java应用程序,该程序将shell脚本作为输入参数并执行它。我正在使用以下代码块来准备环境:
ProcessBuilder pb = new ProcessBuilder("/bin/bash", scriptFile);
Map<String, String> env = pb.environment();
env.putAll(environmentVariable);
Process awk = pb.inheritIO().start();
awk.waitFor();
awk.destroy();
在上面的代码块中,environmentVariable
是一个Map,其中包含一些敏感数据,这些数据稍后将由脚本使用。
我对ProcessBuilder#environment()
的理解是,它仅为该子流程提供环境。您对该环境所做的更改仅影响该子流程。我已经通过浏览ProcessBuilder#environment()
现在我的问题是,在此操作结束时,即,当调用awk.destroy()
时,将擦除环境以及我输入的所有敏感变量,还是手动擦除环境变量会更好使用env.remove(SENSITIVE_VARIABLE_KEY)
或env.putAll(new HashMap<String, String>)
答案 0 :(得分:2)
process.destroy
不会清除ProcessBuilder
上的系统环境。您仍然可以使用相同的PB对象来启动新进程,以及使用相同的环境映射。
我不明白您的要求,为什么要删除环境条目。如果经过awk
处理之后,您不再使用pb
对象,并且没有对它的引用,则Java将对其进行垃圾回收。我看不到从地图上删除敏感条目会给您带来什么。无论如何,您还有另一个Java变量environmentVariable
用于保存您的敏感数据。
对于您的问题,如果要删除一些数据,可以使用map.remove()
,如果要清洁地图,则可以执行pb.environment().clear()
。但是,如果执行此操作,则在使用pb
启动新进程时,它将使用修改后的env-map。