2014-03-07 106 views
0

我正在嘗試ssh一個裝置通過java代碼和我遇到的錯誤。我正在使用 (http://www.jcraft.com/)的罐子。現在這裏是我的問題通過Java的ssh裝置,執行命令並獲得命令響應

  • 如何使用java在chell中執行多個命令? (jcreft lib或一些其它)
  • 如何從下面的代碼(OutputStream的轉換)

    OutputStream out = System.out; 
    PrintStream ps = new PrintStream(out); 
    

    得到的輸出這裏是代碼的快照

    public static String LoginAppliance(String host, String ID)throws JSchException, InterruptedException, IOException 
    { 
         String result="";  
         String command = "_shell\n"; 
         JSch jsch = new JSch(); 
         Session session = jsch.getSession(user, host, 22); 
         session.setPassword(password); 
         session.setConfig("StrictHostKeyChecking", "no"); 
         session.connect(10*1000); 
         Channel channel = session.openChannel("shell"); 
         InputStream is = new ByteArrayInputStream(command.getBytes()); 
         channel.setInputStream(is); 
         channel.setOutputStream(System.out); 
         OutputStream out = System.out; 
         PrintStream ps = new PrintStream(out);   
         channel.connect(15 * 1000); 
         Thread.sleep(3*1000); 
         channel.disconnect(); 
         session.disconnect(); 
         return (result); 
    } 
    

它會替我真的很有幫助。

回答

0
  1. 多個命令可以由分號(;)等進行分離:

    String command = "echo 'hello';echo 'hello2'\n"; 
    
  2. 要獲得而不是將其打印到控制檯等的結果爲一個字符串:

    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    channel.setOutputStream(out); 
    ... 
    return out.toString(); 
    
+0

感謝您的回答。我想通過按鈕(通過GUI)多個命令。不在一個字符串中。例如,我有多個按鈕,Button1用於連接,Button2用於複製數據,Button3用於一些信息。所以每個按鈕都有自己的功能。而2解決方案不適合我。 –

+0

2.部分是從輸出流創建字符串的標準代碼。我不知道爲什麼它不應該工作。我還添加了一個新的答案。 –

0

我誤解了這個問題。我看了一下Jsch的文檔,這是我使它工作的最簡單的方法:

import java.io.IOException; 
import java.io.InputStream; 

import com.jcraft.jsch.ChannelExec; 
import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.Session; 

public class Main { 

    public static void main(String[] args) { 
     String host = "theAddress"; 
     String user = "root"; 
     String password = "thePassword"; 

     JSch jsch = new JSch(); 
     Session session = null; 
     try { 
      session = jsch.getSession(user, host, 22); 
      session.setPassword(password); 
      session.setConfig("StrictHostKeyChecking", "no"); 
      session.connect(10000); 
      System.out.println("-->" + runCommand("echo 'hello'", session)); // -->hello 
      System.out.println("-->" + runCommand("whoami", session)); // -->root 
      System.out.println("-->" + runCommand("date", session)); // -->Thu Mar 13 23:45:39 CET 2014 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (session != null) { 
       session.disconnect(); 
      } 
     } 

    } 

    private static String runCommand(String string, Session session) { 
     ChannelExec channel = null; 
     try { 
      channel = (ChannelExec) session.openChannel("exec"); 
      channel.setCommand(string); 
      channel.connect(); 
      return readOutput(channel); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (channel != null) { 
       channel.disconnect(); 
      } 
     } 
     return null; 
    } 

    private static String readOutput(ChannelExec channel) throws IOException { 
     // code from: http://www.jcraft.com/jsch/examples/Exec.java.html 
     StringBuilder sb = new StringBuilder(); 
     InputStream in = channel.getInputStream(); 
     byte[] tmp = new byte[1024]; 
     while (true) { 
      while (in.available() > 0) { 
       int i = in.read(tmp, 0, 1024); 
       if (i < 0) 
        break; 
       sb.append(new String(tmp, 0, i)); 
      } 
      if (channel.isClosed()) { 
       break; 
      } 
      try { 
       Thread.sleep(1000); 
      } catch (Exception e) {} 
     } 
     return sb.toString(); 
    } 

}