xterm이 쉘의 절대 경로를 찾을 수 없습니다

xterm이 쉘의 절대 경로를 찾을 수 없습니다

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

그래서 나는그놈 터미널SUSE에서 이러한 명령을 사용했는데 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

답변1

xterm은 명령 실행과 관련된 경로 이름에 대해 몇 가지 (다른) 검사를 수행합니다. 요약은 다음과 같습니다.

  • "xterm -e command"라고 말하면 xterm은 기존 $SHELL설정 및/또는 구성 luit( $SHELL다른 방식으로도 사용됨)을 사용하여 명령이 성공하는지 여부를 결정합니다.
  • "xterm command"(옵션 없음)라고 말하면 -exterm은 이를 특수한 경우로 처리하고 절대 경로 이름이어야 합니다. 여기서 일반적으로 문제가 발생합니다.

다음에서 변경패치 #301계속해서(아니요라는 특별한 -e경우를 제외하고) 기존 xterm이 $SHELL나열되어 있는지 확인하세요 /etc/shells. (여기에는 긴 이야기가 있지만 요약하자면 보안 개선입니다...) 변경 로그를 읽어보면 특별한 경우를 적절하게 처리하기 위해 여러 번의 시도가 필요하다는 것을 알 수 있습니다.

제공된 정보에서:

  • 어떤 경우에는 (ProcessBuilder에서) 사용 -e하고 다른 경우에는 사용하지 않기 때문에 몇 가지 문제가 있을 수 있습니다.
  • 아니면 귀하의 제품이 $SHELL목록에 없을 수도 있습니다 /etc/shells.
  • 마지막으로, 프로그램이 luit예기치 않게 실행되도록 하는 일부 리소스 설정(잘못된 로케일 변수와 결합)이 있을 수 있습니다. 예를 들어, xterm을 시도했지만 리소스가 상대 경로로 설정된 경우 luitlocaleFilter오류가 발생합니다 .

관련 정보