SUSE Linux Enterprise12でJava using ProcessBuilder
を使用してスクリプトを実行しようとしています。このためのコードは次のとおりです。
ProcessBuilder pb = new ProcessBuilder("xterm", "-e", "script_path");
Process pr = pb.start();
それから私はProcess
からのメッセージを読みました、それはxterm: no absolute path found for Shell: script_path
と言っています
そこで、SUSEにあるGnome-Terminalから試し、コマンドxterm script_path
を使用しましたが、同じエラーメッセージが見つかりました。フォームルートとローカルユーザーの両方を試しました。私はこのエラーについて完全に手がかりがありません。
そして、主な条件は、私のJavaコードはルートとしてのみ呼び出す必要があるため、このコードをルートとして実行できる必要があることです。
更新:
もう一度試してみましたが、実際にはProcessBuilder
から新しいエラーメッセージが表示されます。 errorstream
から受け取るメッセージは次のとおりです。
error extracting:: error message: Warning: This program is an suid-root program or is being run by the root user.
The full text of the error or warning message cannot be safely formatted in this environment.
You may get a more escriptive message by running the program as a non-root user or by removing the suid bit on the executable.
xterm: Xt error: Can't open display: %s
xterm: DISPLAY is not set
私が実行しようとしているスクリプトはunZipper.sh
です。
#!/bin/bash
Sudo unzip -o postgresql-9.4.6-linux-64.Zip -d some_path/db/
sleep 3
xtermは、コマンドの実行に関係するパス名に対していくつかの(異なる)チェックを行います。シンポシスは次のとおりです。
$Shell
設定および/またはluit
の構成(別の方法で$Shell
も使用)に依存して決定しますコマンドが成功するかどうか。-e
オプションなし)と言うと、xtermはそれを特殊なケースとして扱い、絶対パス名である必要があります。ここで通常の問題が発生します。パッチ#301 以降の変更(および特別なno -e
ケースを除く)では、xtermは既存の$Shell
をチェックして、それが/etc/shells
にリストされていることを確認します。 (ここには長い話がありますが、セキュリティの向上であることに注意して要約してください。)変更ログを読むと、それを正しく行うには、特別な場合を処理するために数回の試行が必要であることがわかります。
与えられた情報から:
-e
を(ProcessBuilderから)使用している場合と使用していない場合があるため、問題が発生している可能性があります。$Shell
が/etc/shells
にリストされていない可能性があります。luit
を実行する可能性があります。たとえば、xtermがluit
を使用しようとしたが、localeFilter
リソースが相対パスに設定されている場合、このエラーが発生します。