我正在尝试使用 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 尝试使用luit
但localeFilter
资源设置为相对路径,则会出现此错误。