Jsch или SSHJ или Ganymed SSH-2? - PullRequest
       39

Jsch или SSHJ или Ganymed SSH-2?

5 голосов
/ 24 февраля 2011
  1. Мне нужно подключиться к серверу (имя пользователя, пароль, хост) - легко

  2. введите 3-10 команд - command = "dir; date; cd; dir "Есть ли более простой способ? без написания 20 строк: while (smtng) {много материала + таинственный отпечаток на scr: D}

  3. скачать файл--легко

  4. записать еще один загруженный файл в тот же файл (добавить не owerride) - есть идеи, как?

Так что выполнить эти невероятно легкозадачи, которые могут показаться невозможными, если вы решитесь использовать Jsch (потрясающая документация), есть выбор между Jsch, sshj, Ganymed, какие-либо предложения?

Mystery:

2) ввод нескольких команд

4) добавление к существующему txt-файлу больше txt: D (возможно, есть команда build in) или нет?

  /* just for download/owerride : sftpChannel.get("downloadfile.txt", "savefile.txt");*/

Ответы [ 3 ]

5 голосов
/ 24 февраля 2011

Я не знаю о Ганимеде.Но я широко использовал JSch для удаленного входа в систему и выполнения сценариев.Я использовал Google Expect4j с Jsch для выполнения сценариев на удаленных машинах в режиме ожидания (отправка / ожидание).Вы можете получить весь вывод выполненной команды или сценариев в своем коде, используя JSch / Expect4j / Closures.

Для jsch перейдите к http://www.jcraft.com/jsch/
Для Expect4j перейдите к http://code.google.com/p/expect4j/

Ниже приведен небольшой пример кода для входа в систему и выполнения файла для удаленного класса Java.

private Expect4j SSH(String hostname, String username,String password, int port) throws Exception {
    JSch jsch = new JSch();
    Session session = jsch.getSession(username, hostname, port);
    if (password != null) {         
        session.setPassword(password);
    }
    Hashtable<String,String> config = new Hashtable<String,String>();
    config.put("StrictHostKeyChecking", "no");
    session.setConfig(config);
    session.connect(60000);
    channel = (ChannelShell) session.openChannel("shell");
    Expect4j expect = new Expect4j(channel.getInputStream(), channel.getOutputStream());
    channel.connect();      
    return expect;
}

Этот метод откроет поток SSH на удаленный сервер, который будет использоваться оператором wait4j для отправки команд.

private boolean executeCommands() {
        boolean isSuccess = true;
        Closure closure = new Closure() {
            public void run(ExpectState expectState) throws Exception {
                buffer.append(expectState.getBuffer());//buffer is string buffer for appending output of executed command             
                expectState.exp_continue();
            }
        };
        List<Match> lstPattern =  new ArrayList<Match>();
        String[] regEx = SSHConstants.linuxPromptRegEx;  
        if (regEx != null && regEx.length > 0) {
            synchronized (regEx) {
                for (String regexElement : regEx) {//list of regx like,  :>, /> etc. it is possible command prompts of your remote machine
                    try {
                        RegExpMatch mat = new RegExpMatch(regexElement, closure);
                        lstPattern.add(mat);                        
                    } catch (MalformedPatternException e) {                     
                        return false;
                    } catch(Exception e) {                      
                        return false;
                    }
                }
                lstPattern.add(new EofMatch( new Closure() { // should cause entire page to be collected
                    public void run(ExpectState state) {
                    }
                }));
                lstPattern.add(new TimeoutMatch(defaultTimeOut, new Closure() {
                    public void run(ExpectState state) {
                    }
                }));
            }
        }
        try {
            Expect4j expect = SSH(objConfig.getHostAddress(), objConfig.getUserName(), objConfig.getPassword(), SSHConstants.SSH_PORT);
            expect.setDefaultTimeout(defaultTimeOut);       
            if(isSuccess) {
                for(String strCmd : lstCmds)
                    isSuccess = isSuccess(lstPattern,strCmd);
            }
            boolean isFailed = checkResult(expect.expect(lstPattern));
            return !isFailed;
        } catch (Exception ex) {            
            return false;
        } finally {
            closeConnection();
        }
    }


private boolean isSuccess(List<Match> objPattern,String strCommandPattern) {
        try {   
            boolean isFailed = checkResult(expect.expect(objPattern));

            if (!isFailed) {
                expect.send(strCommandPattern);         
                expect.send("\r");              
                return true;
            } 
            return false;
        } catch (MalformedPatternException ex) {    
            return false;
        } catch (Exception ex) {
            return false;
        }
}  
2 голосов
/ 21 июня 2011

У Ганимеда теперь новый дом в Google Code , где он поддерживается. Недавно были добавлены патчи для улучшения скорости передачи.

1 голос
/ 24 февраля 2011

Я не могу комментировать остальные, но Ганимед работает очень хорошо.

...