【发布时间】:2018-07-31 01:15:43
【问题描述】:
我在 Windows 中有一个 Java UI。从那个 UI 我想 连接到 unix 服务器 并运行 FNDLOAD 命令。
我找到了一个代码here。但通过这个,我只能运行普通的 unix 命令(如 ls、cd 等)并实现输出。但是当我尝试运行FNDLOAD 命令时,它给了我以下错误
bash: FNDLOAD: 找不到命令
FNDLOAD utility 已安装在服务器上,当我连接到putty 并运行命令时,我也能够获得所需的结果。
有什么方法可以从 Java 运行命令?
编辑 1:
我正在使用jsch 附加库进行连接。这是我正在使用的代码。
import java.io.InputStream;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import java.util.Properties;
public class ShellExecuter {
/**
* @param args
*/
public static void main(String[] args) {
String host = "10.111.111.11";
String user = "username";
String password = "password";
String FND_TOP = "/u01/oracle/fs1/appl/fnd/12.0.0";
String command = "FNDLOAD user/pass O Y DOWNLOAD " + FND_TOP + "/patch/115/import/abc.lct "
+ "/home/applvis/JAVA/abc.ldt PROGRAM APPLICATION_SHORT_NAME=XX "
+ "CONCURRENT_PROGRAM_NAME=UPLOAD_TOOL";
try {
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
JSch jsch = new JSch();
Session session = jsch.getSession(user, host, 22);
session.setPassword(password);
session.setConfig(config);
session.connect();
System.out.println("Connected");
Channel channel = session.openChannel("exec");
((ChannelExec) channel).setCommand(command);
channel.setInputStream(null);
((ChannelExec) channel).setErrStream(System.err);
InputStream in = channel.getInputStream();
channel.connect();
byte[] tmp = new byte[1024];
while (true) {
while (in.available() > 0) {
int i = in.read(tmp, 0, 1024);
if (i < 0) {
break;
}
System.out.print(new String(tmp, 0, i));
}
if (channel.isClosed()) {
System.out.println("exit-status: " + channel.getExitStatus());
break;
}
try {
Thread.sleep(1000);
} catch (Exception ee) {
}
}
channel.disconnect();
session.disconnect();
System.out.println("DONE");
} catch (Exception e) {
e.printStackTrace();
}
}
}
编辑 2
不仅FNDLOAD 命令,我也无法获取系统变量。就像我给出命令$JAVA_TOP 一样,代码不会返回任何内容。 cd $JAVA_TOP 也不起作用。 :(
请大家帮忙..
【问题讨论】:
-
您如何在服务器上从 Java 启动会话?不要发布链接,向我们展示您正在运行的实际代码。问题可能是服务器会话上的
PATH设置不正确。 -
@JimGarrison 我已经发布了我的代码。请看编辑。我正在使用 JSCH 库。我认为
PATH是正确的,因为我能够运行简单的 unix 命令。 -
当您使用 ssh 连接时,您将获得一条最小路径。您可能应该在命令行中指定
FNDLOAD可执行文件的完整路径。 -
@JimGarrison 很抱歉没有正确理解您在说什么。你的意思是
FNDLoad之前的命令我应该移动到特定目录还是在命令中FNDLOAD之前添加一些路径? -
@JimGarrison 你能帮帮我吗?我仍在为这个命令而苦苦挣扎。我尝试移动到 FNDLOAD 可执行路径,但仍然遇到同样的错误。