Runtime.getRuntime().exec()导致java.io.IOException:无法运行程序。。。没有这样的文件或目录
您好,我正在Java和Spring框架中使用Runtime.getRuntime().exec()导致java.io.IOException:无法运行程序。。。没有这样的文件或目录,java,spring,process,openssl,runtime,Java,Spring,Process,Openssl,Runtime,您好,我正在Java和Spring框架中使用openssl生成证书和密钥 下面是我的代码 String[] cmds = new String[4]; cmds[0] = String.format("openssl genrsa -out %s.key 2048", path+name); cmds[1] = String.format("openssl req -new -key %s.key -out %s.csr", path+name, path+name); cmds[2] = St
openssl
生成证书和密钥
下面是我的代码
String[] cmds = new String[4];
cmds[0] = String.format("openssl genrsa -out %s.key 2048", path+name);
cmds[1] = String.format("openssl req -new -key %s.key -out %s.csr", path+name, path+name);
cmds[2] = String.format("openssl x509 -req -in %s.csr -CA %s.pem -CAkey %s.key -CAcreateserial -out %s.crt -days 365 -sha512 -extensions mysection -extfile conf.cnf", path+name, path+rootName, path+rootName, path+name);
cmds[3] = String.format("openssl pkcs12 -export -out %s.pfx -inkey %s.key -in %s.crt", path+name, path+name, path+name);
Runtime r = Runtime.getRuntime();
Process p = null;
try {
p = r.exec(cmds);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
作为回报,我得到了下面的结果
java.io.IOException:无法运行程序“openssl genrsa-out”
/home/lalani/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/api-server/WEB-INF/applications/certificate/Riksof.key
2048“:错误=2,没有这样的文件或目录
请告诉我哪里做错了
还请建议我如何在异步任务中运行此Runtime.getRuntime().exec()
?标题为“无法执行Runtime.getRuntime()”的问题,但这里的问题不是无法执行Runtime.getRuntime(),而是执行p=r.exec(cmds)时的问题代码>,由于以下原因引发IO异常:
Cannot run program "openssl genrsa -out /home/lalani/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/api-server/WEB-INF/applications/certificate/Riksof.key 2048": error=2, No such file or directory
标题为“无法执行Runtime.getRuntime()”的问题,但这里的问题不是无法执行Runtime.getRuntime(),而是执行p=r.exec(cmds)时的问题代码>,由于以下原因引发IO异常:
Cannot run program "openssl genrsa -out /home/lalani/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/api-server/WEB-INF/applications/certificate/Riksof.key 2048": error=2, No such file or directory
Java找不到程序openssl
。您必须提供openssl
可执行文件的完整路径,或确保openssl
的路径位于Java程序可用的路径中。Java无法找到该程序openssl
。您必须提供openssl
可执行文件的完整路径,或者确保openssl
的路径位于Java程序可用的路径中。不需要运行一系列命令。它采用一个描述单个命令的数组
这意味着依赖于系统,但通常数组中的第一个元素是要运行的命令,后续元素描述其参数。例如,如果您想将foo.txt
复制到bar.txt
,您需要:
String[] cmd = { "cp", "foo.txt", "bar.txt" };
p = r.exec(cmd);
因此,您的代码试图调用名为openssl genrsa-out/home/lalani/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/api-server/WEB-INF/applications/certificate/Riksof.key 2048的程序。它试图向这个程序传递三个参数,对应于数组的最后三个元素。但是这个程序并不存在——如果它存在的话,那将是一个非常奇怪的程序
要执行数组中的第一个命令,需要如下数组:
String[] cmd1 = { "openssl", "genrsa", "-out", path + name + ".key", "2048" };
p = r.exec(cmd1);
当然,其他三个命令也需要这样做
文本在终端中起作用的原因是shell实际获取该行,将其解析为其组件(基本上是通过在空格上拆分,将带引号的文本分解),将第一个令牌(openssl
)视为程序,将其余令牌视为其参数。但这种功能是外壳的一部分,而不是底层操作系统Runtime.exec与操作系统对话,因此您需要自己进行分割。不需要运行一系列命令。它采用一个描述单个命令的数组
这意味着依赖于系统,但通常数组中的第一个元素是要运行的命令,后续元素描述其参数。例如,如果您想将foo.txt
复制到bar.txt
,您需要:
String[] cmd = { "cp", "foo.txt", "bar.txt" };
p = r.exec(cmd);
因此,您的代码试图调用名为openssl genrsa-out/home/lalani/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/api-server/WEB-INF/applications/certificate/Riksof.key 2048的程序。它试图向这个程序传递三个参数,对应于数组的最后三个元素。但是这个程序并不存在——如果它存在的话,那将是一个非常奇怪的程序
要执行数组中的第一个命令,需要如下数组:
String[] cmd1 = { "openssl", "genrsa", "-out", path + name + ".key", "2048" };
p = r.exec(cmd1);
当然,其他三个命令也需要这样做
文本在终端中起作用的原因是shell实际获取该行,将其解析为其组件(基本上是通过在空格上拆分,将带引号的文本分解),将第一个令牌(openssl
)视为程序,将其余令牌视为其参数。但这种功能是外壳的一部分,而不是底层操作系统Runtime.exec与操作系统对话,因此您需要自己进行分割。只需完整路径选择要运行的cmd:
例如:“node-e index.js”==>“/path/to/node-e/path/to/index.js”
这是给我的,
在我的例子中,节点位于PATH中,但我不知道为什么它不起作用
例如:“node-e index.js”==>“/path/to/node-e/path/to/index.js”
这是给我的,
在我的例子中,节点在路径中,但我不知道它为什么不工作错误很简单,没有找到键。为什么不尝试一个简单的钥匙位置呢。如果您在linux上,只需输入/home/username/Riksof.key即可。在异步任务中运行此任务是什么意思。运行它的方式已经是异步的,因为当linux命令执行时,除非调用waitFor()方法,否则您不知道它何时完成。这里的path
和name
是什么?您是否传递了正确的位置?是的,从上面的错误/home/lalani/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/api server/WEB-INF/applications/certificate/
是路径,Riksof
是名称。这也不是问题,因为从技术上讲,此文件不存在此命令opensslgenrsa-out Riksof.key 2048
用于在当前位置生成名为Riksof.key
的密钥文件,并且我可以访问此目录/home/lalani/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/api server/WEB-INF/applications/certificate/
使用cd,因此目录存在,以确保错误简单,找不到密钥。为什么不尝试一个简单的钥匙位置呢。你在linux上吗,然后是simp