gpt4 book ai didi

Java、jsch 和 EC2...无法在 root 中运行应用程序

转载 作者:太空宇宙 更新时间:2023-11-04 11:14:20 26 4
gpt4 key购买 nike

我正在通过 Java 和 Jsch 从远程机器连接到 EC2 实例。连接后,我想启动一个位于 root 拥有和创建的目录中的 jboss 服务器。 (我无法改变这一点)。通常在我的 putty shell 中,我会通过发出以下命令来启动 jboss:

myUser@myIP:~# sudo su -
root@myIP:~:# cd jbossDirectory
root@myIp:~/jbossDirectory# ./startJbossScript.sh

当我尝试通过 Java/Jscp 执行相同操作时,问题就出现了。这是我的代码:

import java.io.InputStream;
import java.io.OutputStream;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UserInfo;

public class SSHExecutor {

static String SSHprivateKey = privateKeyFileLocation;
static String username = myUser;
static String hostnamePublicIP = EC2InstanceIP;
static String startJbossCommand = "sudo -i /root/jbossDirectory/startJbossScript.sh";

static String sudo_pass = "";

public static void main(String[] arg) {
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");

try {
JSch jsch = new JSch();
jsch.addIdentity(SSHprivateKey);

Session session = jsch.getSession(username, hostnamePublicIP, 22);

// username and passphrase will be given via UserInfo interface.
UserInfo ui = new MyUserInfo();
session.setUserInfo(ui);
session.setConfig(config);
session.connect();
Channel channel = session.openChannel("exec");
((ChannelExec) channel).setCommand(startJbossCommnand);

InputStream in = channel.getInputStream();
OutputStream out = channel.getOutputStream();
((ChannelExec) channel).setErrStream(System.err);

channel.connect();

out.write((sudo_pass + "\n").getBytes());
out.flush();

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();
} catch (Exception e) {
System.out.println(e);
}
}
}

此程序将正确启动 Jboss。但是,当 Jboss 收到动态页面的请求时,它会抛出以下错误:

06:48:13,137 INFO  [STDOUT] >>>>>>>>/root/.
06:8:13,138 INFO [STDOUT] Exception while initializing hibernate: java.io.FileNotFoundException: WEBAPP_CONF/hibernate.properties (No such file or directory)
06:48:13,141 INFO [[/rubis]] Marking servlet BrowseRegions as unavailable
06:48:13,141 ERROR [[BrowseRegions]] Allocate exception for servlet BrowseRegions
javax.servlet.UnavailableException: Couldn't find file mysql.properties: java.io.FileNotFoundException: WEBAPP_CONF/mysql.properties (No such file or directory)<br>
at edu.rice.rubis.servlets.RubisHttpServlet.init(Unknown Source)
at edu.rice.rubis.servlets.HibernateRubisHttpServlet.init(Unknown Source)
at javax.servlet.GenericServlet.init(GenericServlet.java:212)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1161)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:806)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:129)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
at java.lang.Thread.run(Thread.java:724)

所以看起来是找不到mysql的配置文件。该文件在那里,当我从控制台启动 jboss 时,这个问题不会发生(如上所示)。我的猜测是该进程确实以 sudo -i 命令开始,但是随后它无法访问 jbossDirectory 文件夹中的文件,因此它抛出错误文件未找到。 WEBAPP_CONF/是 jbossDirectory 的子目录。

知道如何解决这个问题吗?

谢谢。

最佳答案

您正在从不同的目录运行 shell 脚本,并且您的代码中有些东西期望启动脚本专门在/root/jbossDirectory 中启动。

一个简单的解决方法是编辑 startJbossScript.sh 并添加

cd /root/jbossDirectory

作为第一行。

关于Java、jsch 和 EC2...无法在 root 中运行应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21695442/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com