2014-02-11 52 views
0

我通過Java和Jsch從遠程計算機連接到EC2實例。一旦連接,我想啓動一個位於由root擁有和創建的目錄中的jboss服務器。 (我不能改變這一點)。當我嘗試通過Java/Jscp做同樣的Java,jsch和EC2 ...無法在根中運行應用程序

[email protected]:~# sudo su - 
[email protected]:~:# cd jbossDirectory 
[email protected]:~/jbossDirectory# ./startJbossScript.sh 

的問題開始: 通常從我的泥殼,我會啓動JBoss通過發出以下命令。這是我的代碼:

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的子目錄。

關於如何解決這個問題的任何想法?

謝謝。

回答

1

您正在從其他目錄運行shell腳本,並且代碼中有某些內容希望啓動腳本專門在/ root/jbossDirectory中啓動。

一個簡單的解決方法是編輯startJbossScript.sh並添加

cd /root/jbossDirectory 

的第一線。

+0

修好了!非常感謝! – fs82

0

在代碼中channel.connect()行前添加下面的線,這將讓你excecute sudo的命令

((ChannelExec)通道).setPty(真);