在尝试使用文件自动执行 Ubuntu 16.04 中的安装过程时.jar
,我不知道如何解决以下问题:
问题描述
部分安装文件会自动生成以下generate
位置的文件,文件名如下/usr/share/taskd/pki/
:
generate
#!/bin/sh
# For a public or production server, purchase a cert from a known CA, and skip
# the next step.
# For development, testing and personal server management, create a CA key and
# cert, and use that to generate a server key and cert. Creates:
# ca.key.pem
# ca.cert.pem
# server.key.pem
# server.cert.pem
./generate.ca
./generate.server
# Generate a certificate revocation list (CRL). The initial CRL is empty, but
# can grow over time. Creates:
# server.crl.pem
./generate.crl
# The above is sufficient to operate a server. What follows is a per-client
# process. Creates:
# ${1}.key.pem
# ${1}.cert.pem
./generate.client client
我有一个执行安装命令的 Java 项目,我从位置运行/mnt/c/example folder/setup.jar
该命令。运行该命令的 Java 代码包括:p = Runtime.getRuntime().exec(String[] command)
并且正在考虑的实际命令由以下命令创建:
commands[10] = new String[2]
commands[10][0] = "sudo";
commands[10][1] = "/usr/share/taskd/pki/generate";
而原始的 shell 命令是:
cd /usr/share/taskd/pki
sudo ./generate
为了解决xy
运行文件的问题./generate
,我可以
- 使用绝对路径在 java 中创建它(将其复制到
/usr/share/taskd/pki/
文件夹)并运行它。 - 创建一个实际执行命令的 shell 命令,而不是文件
.jar
。
问题
然而,我想知道如何将的“当前目录”传递/usr/share/taskd/pki/
给该位置命名的 shell 脚本generate
,以便正确执行/找到、./generate.ca
和./generate/server
。./generate.crl
./generate.client client
尝试
最初我尝试cd
使用该文件root
来从root
到,但是我发现在文件中使用该命令时无效。/usr/share/taskd/pki/
.jar
cd
.jar
疑虑
这似乎纯粹是一个应该发布在 Stack Overflow 上的编程问题,但我认为其本质是特定于平台的;如何在 Ubuntu 中在不同位置的两个脚本之间传递环境/路径。我目前无法预测最终答案是否普遍适用于 Linux 或 Ubuntu 16.04。如果这个观点或假设不正确,请告诉我。
答案1
一般来说,你应该使用java.lang.ProcessBuilder代替Runtime.exec()
。
ProcessBuilder 有一些不错的功能,比如修改环境变量或设置工作目录。
下面是一个例子:
List<String> command = new ArrayList<String>();
command.add("./generate");
File workingDirectory = new File("/usr/share/taskd/pki/");
ProcessBuilder pb = new ProcessBuilder(command);
pb.directory(workingDirectory);
Process p = pb.start();