web-dev-qa-db-ja.com

xtermシェルの絶対パスが見つかりません

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
2
ShaDooW

xtermは、コマンドの実行に関係するパス名に対していくつかの(異なる)チェックを行います。シンポシスは次のとおりです。

  • 「xterm-eコマンド」と言うと、xtermは既存の$Shell設定および/またはluitの構成(別の方法で$Shellも使用)に依存して決定しますコマンドが成功するかどうか。
  • 「xtermコマンド」(-eオプションなし)と言うと、xtermはそれを特殊なケースとして扱い、絶対パス名である必要があります。ここで通常の問題が発生します。

パッチ#301 以降の変更(および特別なno -eケースを除く)では、xtermは既存の$Shellをチェックして、それが/etc/shellsにリストされていることを確認します。 (ここには長い話がありますが、セキュリティの向上であることに注意して要約してください。)変更ログを読むと、それを正しく行うには、特別な場合を処理するために数回の試行が必要であることがわかります。

与えられた情報から:

  • -eを(ProcessBuilderから)使用している場合と使用していない場合があるため、問題が発生している可能性があります。
  • または、$Shell/etc/shellsにリストされていない可能性があります。
  • 最後に、(誤ったロケール変数と組み合わされた)リソース設定が原因で、プログラムが予期せずluitを実行する可能性があります。たとえば、xtermがluitを使用しようとしたが、localeFilterリソースが相対パスに設定されている場合、このエラーが発生します。
2
Thomas Dickey