【问题标题】:Jsch or SSHJ or Ganymed SSH-2?Jsch 或 SSHJ 或 Ganymed SSH-2?
【发布时间】:2011-07-03 02:55:29
【问题描述】:
  1. 我需要连接到服务器(用户名、密码、主机)--简单

  2. 输入 3-10 个命令 -- command="dir;date;cd;dir" 有没有更简单的方法?,不用写 20 行:while(smtng) { 很多东西 + 神秘打印到 scr: D }

  3. 下载文件——简单

  4. 将另一个下载的文件写入同一个文件(添加而不是 owerride)——有什么想法吗?

所以要执行这些难以置信的简单任务,如果你敢于使用 Jsch(糟糕的文档),这似乎是不可能的,在 Jsch、sshj、Ganymed 之间进行选择有什么建议吗?

谜底:

2) 多个命令输入

4) 是否向现有 txt 文件添加更多 txt :D(可能有内置命令)?

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

【问题讨论】:

  • 请注意:我写了一些Javadocs for JSch,这可能有助于解决文档问题。

标签: java ssh jsch sshj


【解决方案1】:

我不知道 Ganymed。 但是我已经将 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 流,expect4j 将使用该流发送命令。

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;
        }
}  

【讨论】:

  • 嗨,@nIKUNJ 究竟是什么 /Expect4j/Clousers
  • Google 的 Expect4j 用于后续执行命令。假设你有 10 个 shell 命令并且你想在远程 linux 机器上执行。发布一个命令后,您必须等待命令输出。表示发送/等待功能。您还可以使用带有闭包的 expect4j 在您的机器上获取命令输出。您可以获取您在机器上执行的所有命令的日志并保存。
  • 这似乎是一件了不起的事情,任何例子:) ?
  • 当我尝试编译第一个示例时出现此错误(是的,我已经导入了 expect4j jar)运行:线程“main”中的异常 java.lang.NoClassDefFoundError: org/apache/oro/text /regex/Perl5Matcher 在 expect4j.Expect4j.(Expect4j.java:37) 在 expect4j.Expect4j.(Expect4j.java:61) 在 newpkg.Main.SSH(Main.java:41) 在 newpkg。 Main.main(Main.java:54)
  • 要编译这些示例,您需要导入 oro-2.0.8.jar!!!! (使用谷歌的 3-4 个链接,其他前 2 个只是为了混淆)解决了我的问题 :)
【解决方案2】:

我无法评论其他人,但 Ganymed 确实运作良好。

【讨论】:

  • 维护已停止(支持很可能相同)。所以任何严重的问题都会导致拒绝这个库。
  • @den-javamaniac:实际上不是。它在网站上写着“请访问 Cleondris 网站 www.cleondris.ch,以防您需要更新和支持”,该网站上的联系页面已于 2010 年 8 月发布。从来没有任何支持,它是开源。
  • 哦对了,第一次没见过。
  • @downvoter 请解释一下。我可以评论其他人吗? Ganymede 确实对我有用吗?很难知道这里可能存在什么问题。
猜你喜欢
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 2015-05-06
  • 1970-01-01
  • 2020-09-17
相关资源
最近更新 更多