web-dev-qa-db-ja.com

Java Ubuntu 16.04のシェルスクリプトに/現在のディレクトリを渡す/設定する

_.jar_ファイルを使用してUbuntu 16.04のインストールプロセスを自動化しようとしましたが、次の問題を解決する方法がわかりませんでした。

問題の説明

インストールファイルの一部により、_/usr/share/taskd/pki/_にgenerateという次のファイルが自動的に生成されます。

_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";
_

元のシェルコマンドは次のとおりです。

_cd /usr/share/taskd/pki
Sudo ./generate
_

_./generate_ファイルの実行に関するxy問題を解決するために、

  1. Javaに絶対パスを付けて作成し、(_/usr/share/taskd/pki/_フォルダにコピー))実行します。
  2. _.jar_ファイルの代わりに、実際にコマンドを実行するシェルコマンドを作成します。

質問

ただし、_/usr/share/taskd/pki/_の「現在のディレクトリ」をその場所にあるgenerateという名前のシェルスクリプトに渡して、_./generate.ca_、_./generate/server_、 _./generate.crl_と_./generate.client client_が正しく実行/検出されます。

試行

最初に_/usr/share/taskd/pki/_ファイルを使用してcdからrootへ、およびrootから_.jar_への変換を試みましたが、cd.jar_内から使用した場合、_コマンドは無効になります。

疑問

これは純粋にプログラミングの質問のように見えるかもしれませんが、Stack Overflowに投稿する必要がありますが、本質はプラットフォーム固有であると思います。異なる場所にある2つのスクリプト間でUbuntuの環境/パスを渡す方法。現在、最終的な回答がLinuxまたはUbuntu 16.04に一般的に適用されるかどうかは予測できません。この見方や仮定が正しくない場合はお知らせください。

1
a.t.

通常、Runtime.exec()の代わりに Java.lang.ProcessBuilder を使用する必要があります。

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();
2
danzel