当前位置: 首页 > 面试题库 >

在sshj中执行命令序列

扶誉
2023-03-14
问题内容

我需要使用sshj库通过ssh在远程服务器上执行一些命令序列。

我做

        Session session = ssh.startSession();
        Session.Command cmd = session.exec("ls -l");
        System.out.println(IOUtils.readFully(cmd.getInputStream()).toString());
        cmd.join(10, TimeUnit.SECONDS);
        Session.Command cmd2 = session.exec("ls -a");
        System.out.println(IOUtils.readFully(cmd2.getInputStream()).toString());

它把我扔了

net.schmizz.sshj.common.SSHRuntimeException:该会话通道已全部用尽

但是我无法为每个命令重新创建会话,因为此示例将显示主目录列表,但不显示/ some / dir列表。


问题答案:

您可以考虑使用类似Expect的第三方库,该库简化了使用远程服务和捕获输出的过程。这些库旨在执行一系列命令。您可以尝试以下一组不错的选择:

  • Expect4J
  • 期望
  • Java的期望

但是,当我要解决类似的问题时,我发现这些库已经很旧了。它们还引入了很多不需要的依赖项。因此,我创建了自己的,并提供给其他人。它称为ExpectIt。我的图书馆的优势在项目主页上有所说明。您可以尝试一下。

这是一个使用sshj与公共远程SSH服务进行交互的示例:

    SSHClient ssh = new SSHClient();
    ...
    ssh.connect("sdf.org");
    ssh.authPassword("new", "");
    Session session = ssh.startSession();
    session.allocateDefaultPTY();
    Shell shell = session.startShell();
    Expect expect = new ExpectBuilder()
            .withOutput(shell.getOutputStream())
            .withInputs(shell.getInputStream(), shell.getErrorStream())
            .build();
    try {
        expect.expect(contains("[RETURN]"));
        expect.sendLine();
        String ipAddress = expect.expect(regexp("Trying (.*)\\.\\.\\.")).group(1);
        System.out.println("Captured IP: " + ipAddress);
        expect.expect(contains("login:"));
        expect.sendLine("new");
        expect.expect(contains("(Y/N)"));
        expect.send("N");
        expect.expect(regexp(": $"));
        expect.send("\b");
        expect.expect(regexp("\\(y\\/n\\)"));
        expect.sendLine("y");
        expect.expect(contains("Would you like to sign the guestbook?"));
        expect.send("n");
        expect.expect(contains("[RETURN]"));
        expect.sendLine();
    } finally {
        session.close();
        ssh.close();
        expect.close();
    }

这是完整可行示例的链接。



 类似资料:
  • 问题内容: 我想连续执行多个命令: 即(只是为了说明我的需要): (贝壳) 然后 和 并读取的结果。 对模块有任何想法吗? 更新: 而只是一个例子。我需要运行复杂的命令(遵循特定的顺序,没有任何流水线操作)。实际上,我想要一个子进程外壳,并希望能够在其上启动许多命令。 问题答案: 有一种简单的方法可以执行一系列命令。 在以下使用 或者,如果您陷在Windows中,则有多种选择。 创建一个临时的“

  • 问题内容: 我有一个我需要使用程序执行的程序。有人可以指导我该怎么做吗? 我的命令是 问题答案: 您应该编写一个这样的Java程序,这是一个基于Nirman的技术博客的示例,其基本思想是执行如下调用PowerShell进程的命令: 为了执行Powershell脚本

  • 问题内容: 自寻找以来已经有一段时间了,但找不到解决方案。我试图在.jar文件中的Linux上执行bash命令。为此,我尝试了很多事情,包括: 因此,当我单击.jar文件时,我希望程序打开bash并执行命令(java -jar …),以执行程序的另一部分。 关于如何做的任何想法? 问题答案: 要了解这一点,您首先需要了解如何在shell提示符下运行该命令。 请注意双引号在哪里。第一个参数是。第二个

  • 通常情况下,我将执行以下操作: 然后我会得到DVD 1和DVD 2的标题。如果我想打印100个标题的DVD,显然我需要很多 我设法将这些system.out.println放在ArrayList中,如下所示: 但是,我无法执行那些system.out.println来显示标题。因此,如何执行碰巧是System.out.println命令的ArrayList的值? 非常感谢任何帮助。谢谢.

  • 问题内容: 我正在尝试在Java中为Linux / unix os执行awk命令,但问题是当我执行命令时它没有显示任何错误它。但是执行后没有输出,执行它需要几分之一秒,我不知道问题请帮忙。 该代码是 谢谢您的帮助 问题答案: 使用Java正确启动命令行过程并不容易。我建议您使用commons- exec 而不是自己尝试。 现在,您在命令行中有两件事需要特殊处理: AWK脚本周围的单引号。当您将每个

  • 问题内容: 我正在寻找在Go中执行shell命令,并在程序中以字符串形式获取结果输出。我看到了Rosetta Code 版本: 但这并不能以我可以通过编程方式访问的方式捕获实际的标准或错误-那些仍会打印到常规的stdout / stderr。我看到使用Pipe作为out或err可以在其他地方提供帮助,但是没有如何执行此操作的示例。有任何想法吗? 问题答案: 该答案不代表Go标准库的当前状态。请查看