javaを使用してSUSE Linux Enterprise 12でスクリプトを実行しようとしていますProcessBuilder
。コードは次のとおりです。
ProcessBuilder pb = new ProcessBuilder("xterm", "-e", "script_path");
Process pr = pb.start();
それから送ったメッセージを読んだのですが、Process
こうなりました。xterm: no absolute path found for shell: script_path
だから私はGNOME端末SUSEでこれらのコマンドを使用しましたが、xterm script_path
同じエラーメッセージが見つかりました。 rootユーザーとローカルユーザーを試しました。私はこのエラーをまったく認識しません。
主な条件は、私のJavaコードはrootとしてのみ呼び出すことができるので、このコードをrootとして実行できるはずです。
修正する:
もう一度試しましたが、実際に次のメッセージを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
答え1
xterm は、コマンドの実行に関連するパス名に対していくつかの(異なる)チェックを実行します。要約は次のとおりです。
- 「xterm -e command」と言うと、xtermは既存の
$SHELL
設定および/または構成luit
($SHELL
他の方法でも使用されます)を使用してコマンドが成功するかどうかを決定します。 - 「xterm command」(オプションなし)と言うと、
-e
xtermはそれを特別なケースとして扱い、絶対パス名でなければなりません。ここでは通常問題が発生します。
次から変更パッチ#301続けて(いいえという特別な-e
場合を除き)、既存のxtermがリストされていることを$SHELL
確認してください/etc/shells
。 (ここには長い話がありますが、要約するとセキュリティの改善です...)変更ログを読むと、特別なケースを適切に処理するために複数の試みが必要であることがわかります。
提供された情報から:
- 場合によっては(ProcessBuilderで)使用し、
-e
他の場合は使用しないため、いくつかの問題がある可能性があります。 - または、あなたの製品が
$SHELL
リストにないかもしれません/etc/shells
。 - 最後に、プログラムが
luit
予期せず実行されるようにするいくつかのリソース設定(誤ったロケール変数と組み合わせる)があるかもしれません。たとえば、xtermを試してもリソースが相対パスに設定されていると、luit
このlocaleFilter
エラーが発生します。