xterm 找不到 shell 的绝对路径

xterm 找不到 shell 的绝对路径

我正在尝试使用 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 身份调用。

更新:

我再次尝试,现在我实际上收到了来自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 命令”,xterm 将依赖于你现有的$SHELL设置和/或配置luit(也$SHELL以不同的方式使用)来决定该命令是否成功。
  • 如果您说“xterm 命令”(无-e选项),xterm 会将其视为特殊情况,要求它是绝对路径名。这就是通常出现问题的地方。

变化自补丁 #301继续(除了特殊的 no-e情况)xterm 检查现有的$SHELL以确保它列在/etc/shells. (这里有一个很长的故事,但总结一下,这是安全性的改进..)。如果您阅读变更日志,您会发现要正确处理特殊情况需要进行几次尝试。

从给出的信息来看:

  • 由于您在一种情况下使用-e(来自 ProcessBuilder)而不是在另一种情况下使用,因此可能存在一些问题。
  • 或者您的$SHELL可能未列在 中/etc/shells
  • 最后,可能存在一些资源设置(与不正确的区域设置变量相结合)导致程序luit意外执行。例如,如果 xterm 尝试使用luitlocaleFilter资源设置为相对路径,则会出现此错误。

相关内容