<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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

    主干代碼如下 轉載注明:http://www.tkk7.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小蝎 閱讀(5493) 評論(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(),由于需要輸入時是不存在換行的,所以無法讀到完整的一行,一直阻塞  回復  更多評論   

    <2015年7月>
    2829301234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    導航

    統計

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    友情鏈接

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲伊人久久成综合人影院| 中国一级特黄的片子免费 | 一区二区三区观看免费中文视频在线播放| 国产亚洲日韩在线三区| 成人网站免费大全日韩国产| 亚洲AV日韩AV高潮无码专区| 久久精品国产精品亚洲艾草网| 午夜亚洲乱码伦小说区69堂| 亚洲国产一区明星换脸| 亚洲一区二区三区高清不卡| 波霸在线精品视频免费观看| 亚洲AV综合色区无码一区| 久久久久久精品免费看SSS| 亚洲无码一区二区三区| 免费一级黄色毛片| 日韩精品免费在线视频| 亚洲制服丝袜一区二区三区| 亚洲精品岛国片在线观看| 免费成人高清在线视频| 免费观看国产小粉嫩喷水| 久久久久久久久久久免费精品| 亚洲成年轻人电影网站www| 性盈盈影院免费视频观看在线一区| 国产免费牲交视频| 久久国产精品免费一区| 日木av无码专区亚洲av毛片| 日韩精品无码人妻免费视频| 国内精品99亚洲免费高清| 国产 亚洲 中文在线 字幕| 亚洲人成色77777在线观看大| 免费观看激色视频网站bd| 日韩毛片一区视频免费| 亚洲1234区乱码| 最近免费中文字幕MV在线视频3| 最新欧洲大片免费在线 | 亚洲国产精品国自产电影| 最近最好的中文字幕2019免费 | 亚洲成av人片一区二区三区| 99久久国产免费-99久久国产免费 99久久国产免费中文无字幕 | 国产资源免费观看| 免费国产叼嘿视频大全网站 |