基于開源ssh Ganymed 的ssh遠程連接工具(共同討論版)

          本工具模仿putty 實現了簡單的ssh 遠程交互功能。
          本工具可嵌入到集群管理工具
          目前尚在探索,錯誤之處歡迎指正

          主干代碼如下 轉載注明:http://www.aygfsteel.com/roymoro/archive/2012/08/12/385318.html
            1package cn.edu.neu.neuInfo.until.shell;
            2
            3import java.io.BufferedReader;
            4import java.io.IOException;
            5import java.io.InputStream;
            6import java.io.InputStreamReader;
            7import java.io.OutputStream;
            8import java.io.OutputStreamWriter;
            9import java.io.PrintStream;
           10import java.io.PrintWriter;
           11import java.io.UnsupportedEncodingException;
           12import java.util.Scanner;
           13
           14import javax.swing.JTextArea;
           15
           16
           17
           18import ch.ethz.ssh2.ChannelCondition;
           19import ch.ethz.ssh2.Connection;
           20import ch.ethz.ssh2.ConnectionInfo;
           21import ch.ethz.ssh2.Session;
           22
           23public class LinuxFSTool {
           24     private static Connection con; 
           25     private static Session session;
           26    private static PrintWriter out;
           27     static ReadThread rt;
           28    static ReadThread rt2;
           29    static OutputStream outStream;
           30    private static String address,username,password;
           31     private static NeuInfoConfigration neuInfoConfig=NeuInfoConfigration.getInstance("linuxTool.properties");
           32    
           33     public static boolean setConnect(String username,String password,String address) throws IOException{
           34         LinuxFSTool.address=address;
           35         LinuxFSTool.username=username;
           36         LinuxFSTool.password=password;
           37        return connectFS();
           38     }

           39     public static boolean isconnected()
           40     {
           41         if(con==nullreturn false;
           42         return true;
           43     }

           44     public static boolean connectFS() throws IOException{
           45        if(address==null||address.equals(""))
           46         address=neuInfoConfig.getvalue(Parameters.Linux_ADDRESS.name);
           47        if(username==null||username.equals(""))
           48         username=neuInfoConfig.getvalue(Parameters.Linux_USERNAME.name);
           49        if(password==null||password.equals(""))
           50        password=neuInfoConfig.getvalue(Parameters.Linux_PASSWORD.name);
           51        System.out.println(address+":"+username+":"+password);
           52          con = new Connection(address);
           53         ConnectionInfo info = con.connect();
           54         //System.out.println(info.serverHostKey);
           55         boolean result = con.authenticateWithPassword(username, password);
           56         if(result==false){ con.close();con=null;}
           57         return result;
           58    }

           59    public static void disconnectFS() throws IOException{
           60        if(rt.isAlive()){
           61            rt.stopThread();
           62        }

           63        if(rt2.isAlive()){
           64            rt2.stopThread();
           65        }

           66        session.close();
           67        con.close();
           68        session=null;
           69        con=null;
           70    }

           71    private static void shellRun(OutputStream outStream,JTextArea jta){
           72        LinuxFSTool.outStream=outStream;
           73        try{
           74            if(con==null) connectFS();//如果未連接 則連接
           75         session = con.openSession();
           76        session.requestPTY("bash");
           77        session.startShell();
           78        InputStream in=session.getStdout();
           79         rt=new ReadThread(in,new PrintStream(outStream),jta);
           80        rt2=new ReadThread(session.getStderr(),new PrintStream(outStream),jta);
           81        rt.start();  
           82        rt2.start();
           83        out = new PrintWriter(new OutputStreamWriter(session.getStdin(),"UTF-8"));
           84    }
           catch (Exception ex) {
           85        System.out.println(ex.getLocalizedMessage());
           86        ex.printStackTrace();
           87    }

           88    }

           89    public static void executeCommand(String command){
           90        executeCommand(command,System.out,null);
           91    }

           92    /**
           93     *  use these instead of {@link LinuxFSTool#executeCommand(String)}
           94     * @param command
           95     * @param outStream
           96     */

           97    public static void executeCommand(String command,OutputStream outStream,JTextArea jta){  
           98                
           99            if(session==null)
          100                shellRun(outStream,jta);
          101            if(!command.equals("")) {
          102            out.println(command);}

          103            out.flush();
          104            if(command.endsWith("bye"))
          105                closeShell();
          106                }

          107            
          108                   // System.out.println(session.getExitStatus());
          109                   
          110    }

          111    private static void closeShell(){
          112        session.close();
          113        session.waitForCondition(ChannelCondition.CLOSED | ChannelCondition.EOF | ChannelCondition.EXIT_STATUS, 30000);
          114        //StringBuilder sb=new StringBuilder();\
          115        System.out.println("byebye");
          116    }

          117    /**
          118     * test
          119     * @param args
          120     * @throws IOException 
          121     */

          122    public static void main(String[] args) throws IOException {
          123        Scanner scan=new Scanner(System.in);
          124        while(scan.hasNext()){
          125        LinuxFSTool.executeCommand(scan.nextLine(), System.out,null);
          126        }

          127        
          128    }

          129}

          130
          131class ReadThread extends Thread{
          132    private InputStream in;//輸入流
          133    private PrintStream out;
          134    private String charset;
          135    private JTextArea jta;
          136    private boolean flag=true;
          137    public void stopThread(){
          138        flag=false;
          139    }

          140    public ReadThread(InputStream in,PrintStream out,String charset) {
          141        this.out=out;
          142        this.in = in;
          143        this.charset=charset;
          144    }

          145    public ReadThread(InputStream in,PrintStream out,JTextArea jta,String charset) {
          146        this.out=out;
          147        this.jta=jta;
          148        this.in = in;
          149        this.charset=charset;
          150    }

          151    public ReadThread(InputStream in,PrintStream out,JTextArea jta) {
          152        this(in, out, jta, "utf-8");
          153    }

          154    public ReadThread(InputStream in,PrintStream out) {
          155    this(in,out,"utf-8");
          156        
          157    }

          158    public ReadThread(InputStream in,String charset) {
          159        this(in,System.out,charset);
          160    
          161    }

          162    
          163    public ReadThread(InputStream in){
          164        this(in, "utf-8");
          165    }

          166    
          167    @Override
          168    public void run() {
          169        BufferedReader br;
          170        try {
          171            br = new BufferedReader(new InputStreamReader(in,charset));
          172        
          173         String temp;
          174           
          175                while((temp=br.readLine())!=null&&flag==true){
          176        // while(br.ready()&&flag==true){//
          177            // temp=br.readLine();
          178                    if(out!=null)
          179                    {    out.println(temp);
          180                    out.flush();}

          181                    if(jta!=null){
          182                        jta.setText(jta.getText()+temp+"\n");
          183                    }

          184                }

          185                
          186    }
           catch (UnsupportedEncodingException e1) {
          187        // TODO Auto-generated catch block
          188        e1.printStackTrace();
          189    }
           catch (IOException e) {
          190        // TODO Auto-generated catch block
          191        e.printStackTrace();
          192    }
          }

          193    
          194}

          195

          目前本工具存在如下問題:
          當輸入例如 rm wenjian時 ,由于正常的ssh 會返回是否刪除確認,初步分析 由于Ganymed 對返回消息的阻塞,本程序 是否刪除某文件顯示不出來。只有在下一次命令輸入時才返回 是否刪除某文件 ?新打入的命令。eclipse項目包,見附件。望大神,大叔,大嬸指導。
          其余bug 也歡迎指導,本文僅供參考,不足之處多有諒解,轉帖請注明地址。
           


          附件下載地址

          posted on 2012-08-12 18:34 scorpio小蝎 閱讀(5504) 評論(4)  編輯  收藏 所屬分類: java

          評論

          # re: 基于開源ssh Ganymed 的ssh遠程連接工具(共同討論版) 2012-08-12 19:15 scorpio小蝎

          連續使用命令 為command1 && command2
          但是rm filename && rm:
          輸出結果為:
          [root@hadoop01 ~]# rm wangmian && y

          再次輸入 ls后,輸出結果為:

          是否刪除普通文件 "filename"?ls
          說明結果是被阻塞  回復  更多評論   

          # re: 基于開源ssh Ganymed 的ssh遠程連接工具(共同討論版) 2012-10-11 15:21 qq304863386

          可以直接執行 su - 切換用戶命令嗎?發現切換用戶用ganymed有問題,老是切換不了  回復  更多評論   

          # re: 基于開源ssh Ganymed 的ssh遠程連接工具(共同討論版) 2015-07-09 14:53 taisenki

          返回結果被阻塞是由于while((temp=br.readLine())!=null&&flag==true)這里的br.readLine(),由于需要輸入時是不存在換行的,所以無法讀到完整的一行,一直阻塞  回復  更多評論   

          <2012年10月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導航

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 商洛市| 保德县| 淳化县| 商河县| 荃湾区| 瓮安县| 娄底市| 冀州市| 太白县| 虎林市| 玛沁县| 绥棱县| 邵阳县| 乌恰县| 遵化市| 萨嘎县| 阳泉市| 敦化市| 梓潼县| 崇州市| 沙坪坝区| 准格尔旗| 岗巴县| 茶陵县| 揭东县| 东海县| 六盘水市| 米易县| 嘉善县| 文昌市| 株洲县| 灌云县| 当雄县| 政和县| 和龙市| 利川市| 东乌珠穆沁旗| 九台市| 安化县| 崇阳县| 志丹县|