2011-01-05 215 views
0

我需要從java執行(運行)駐留在服務器(Solaris)中的shell腳本。請幫助我如何從java執行文件。?我嘗試過使用TelnetToClient的sendCommand()。所以請幫助我從我的GUI上運行一個文件。需要從java執行shell腳本

該程序是這樣的。

TelnetToPort tele = new TelnetToPort("opmer3"); 
tele.login("root","root"); 
String command_ = "/usr/bin/bash /opt/nrl/logs/applications/ns/lccommands.sh"; 
tele.runComm(command_); 
+0

當你運行這個時會發生什麼?你會得到什麼錯誤?另外,什麼是「TelnetToPort」?這是你寫的東西,還是你下載的包? – 2011-01-05 06:40:13

+0

您是否嘗試過'-c'選項:'... bash -c/opt/nrl/...'? – 2011-01-05 08:57:07

回答

1


如果您正在尋找最優的解決方案,用於執行任何腳本爲您的Java類,那麼你可以使用Jsch與谷歌Expect4j庫。

對於jsch,去http://www.jcraft.com/jsch/
對於Expect4j,去http://code.google.com/p/expect4j/

以下爲日誌和執行文件來回遠程Java類的小代碼示例。

private Expect4j SSH(String hostname, String username,String password, int port) throws Exception { 
    JSch jsch = new JSch(); 
    Session session = jsch.getSession(username, hostname, port); 
    if (password != null) {   
     session.setPassword(password); 
    } 
    Hashtable<String,String> config = new Hashtable<String,String>(); 
    config.put("StrictHostKeyChecking", "no"); 
    session.setConfig(config); 
    session.connect(60000); 
    channel = (ChannelShell) session.openChannel("shell"); 
    Expect4j expect = new Expect4j(channel.getInputStream(), channel.getOutputStream()); 
    channel.connect();  
    return expect; 
} 

此方法將打開SSH流到遠程服務器,將由expect4j用於發送命令。

private boolean executeCommands() { 
     boolean isSuccess = true; 
     Closure closure = new Closure() { 
      public void run(ExpectState expectState) throws Exception { 
       buffer.append(expectState.getBuffer());    
       expectState.exp_continue(); 
      } 
     }; 
     List<Match> lstPattern = new ArrayList<Match>(); 
     String[] regEx = SSHConstants.linuxPromptRegEx; 
     if (regEx != null && regEx.length > 0) { 
      synchronized (regEx) { 
       for (String regexElement : regEx) {//list of regx like, :>, /> etc. it is possible command prompts of your remote machine 
        try { 
         RegExpMatch mat = new RegExpMatch(regexElement, closure); 
         lstPattern.add(mat);       
        } catch (MalformedPatternException e) {      
         return false; 
        } catch(Exception e) {      
         return false; 
        } 
       } 
       lstPattern.add(new EofMatch(new Closure() { // should cause entire page to be collected 
        public void run(ExpectState state) { 
        } 
       })); 
       lstPattern.add(new TimeoutMatch(defaultTimeOut, new Closure() { 
        public void run(ExpectState state) { 
        } 
       })); 
      } 
     } 
     try { 
      Expect4j expect = SSH(objConfig.getHostAddress(), objConfig.getUserName(), objConfig.getPassword(), SSHConstants.SSH_PORT); 
      expect.setDefaultTimeout(defaultTimeOut);  
      if(isSuccess) { 
       for(String strCmd : lstCmds) 
        isSuccess = isSuccess(lstPattern,strCmd); 
      } 
      boolean isFailed = checkResult(expect.expect(lstPattern)); 
      return !isFailed; 
     } catch (Exception ex) {    
      return false; 
     } finally { 
      closeConnection(); 
     } 
    } 


private boolean isSuccess(List<Match> objPattern,String strCommandPattern) { 
     try { 
      boolean isFailed = checkResult(expect.expect(objPattern)); 

      if (!isFailed) { 
       expect.send(strCommandPattern);   
       expect.send("\r");    
       return true; 
      } 
      return false; 
     } catch (MalformedPatternException ex) {  
      return false; 
     } catch (Exception ex) { 
      return false; 
     } 
    } 

希望得到這個幫助。
謝謝。