在 Ubuntu 16.04 中从 Java 将“当前目录”传递/设置为 shell 脚本

在 Ubuntu 16.04 中从 Java 将“当前目录”传递/设置为 shell 脚本

在尝试使用文件自动执行 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,我可以

  1. 使用绝对路径在 java 中创建它(将其复制到/usr/share/taskd/pki/文件夹)并运行它。
  2. 创建一个实际执行命令的 shell 命令,而不是文件.jar

问题

然而,我想知道如何将的“当前目录”传递/usr/share/taskd/pki/给该位置命名的 shell 脚本generate,以便正确执行/找到、./generate.ca./generate/server./generate.crl./generate.client client

尝试

最初我尝试cd使用该文件root来从root到,但是我发现在文件中使用该命令时无效。/usr/share/taskd/pki/.jarcd.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();

相关内容