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

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

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

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

    本工具模仿putty 實現(xiàn)了簡單的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小蝎 閱讀(5494) 評論(4)  編輯  收藏 所屬分類: java

    評論

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

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

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

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

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

    可以直接執(zhí)行 su - 切換用戶命令嗎?發(fā)現(xiàn)切換用戶用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

    導航

    統(tǒng)計

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    友情鏈接

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 日韩视频在线精品视频免费观看 | 亚洲va中文字幕| 国产免费黄色大片| 91免费福利视频| 亚洲理论片在线中文字幕| 日本一区免费电影| 免费网站看av片| 亚洲日韩AV无码一区二区三区人| 免费在线观看亚洲| 久久aa毛片免费播放嗯啊| 亚洲精华国产精华精华液好用| 国产成人麻豆亚洲综合无码精品| 曰批全过程免费视频网址| 亚洲AV无码国产剧情| 久久精品国产精品亚洲艾| 四虎在线免费播放| 免费人成视频在线观看网站| 亚洲AV永久无码天堂影院| 国产AV无码专区亚洲A∨毛片| 成人au免费视频影院| 日本免费中文字幕| 另类图片亚洲校园小说区| 亚洲综合网美国十次| 亚洲乱码中文字幕综合234| 在线看免费观看AV深夜影院| 一级特黄录像免费播放肥| 亚洲日产乱码一二三区别| 亚洲国产精品久久66| 国产一级一片免费播放i| 最近中文字幕免费2019| 精品免费久久久久国产一区 | 性做久久久久久免费观看| 成人性做爰aaa片免费看| 亚洲av日韩av永久无码电影| 亚洲黄色免费网站| 亚洲AV性色在线观看| 亚洲福利在线观看| 亚洲性猛交XXXX| 一本久久综合亚洲鲁鲁五月天| 日韩视频在线精品视频免费观看| 久久香蕉国产线看免费|