<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小蝎 閱讀(5509) 評論(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

    導航

    統計

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    友情鏈接

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲香蕉免费有线视频| 无码毛片一区二区三区视频免费播放 | 国产视频精品免费| 亚洲人精品亚洲人成在线| 114级毛片免费观看| 亚洲人成片在线观看| 成熟女人牲交片免费观看视频| 亚洲欧洲日产国产综合网| 最近中文字幕完整免费视频ww| 亚洲色偷偷av男人的天堂| 免费精品国产自产拍在线观看图片| 91亚洲性爱在线视频| 在线播放高清国语自产拍免费| 美女羞羞喷液视频免费| 亚洲无码黄色网址| 国产无遮挡无码视频免费软件| 亚洲精品自产拍在线观看动漫| 国产成人精品免费午夜app| 亚洲AV无码一区二区三区电影| 色www永久免费视频| 精品免费视在线观看| 亚洲成人免费网站| 午夜a级成人免费毛片| 九一在线完整视频免费观看| 国产国拍亚洲精品mv在线观看| 99在线视频免费| 亚洲中文无码永久免费| yy6080亚洲一级理论| av永久免费网站在线观看 | 久久免费99精品国产自在现线 | 亚洲无人区午夜福利码高清完整版| 成人性生交大片免费看中文| 亚洲国产超清无码专区| 国产免费观看青青草原网站| 免费观看一区二区三区| 国产AV旡码专区亚洲AV苍井空| 久久亚洲AV无码西西人体| 18以下岁毛片在免费播放| 国产99久久亚洲综合精品| 亚洲邪恶天堂影院在线观看| 色www永久免费视频|