0

我了解如何创建 ssh shell

Shell ssh = new SshByPassword("192.168.1.5", 22, "admin", "password");

我也了解如何运行命令

String output = new Shell.Plain(ssh).exec("some command");

我可以轻松分析输出字符串

但是我如何一个接一个地发送相同的“shell”命令

和奖励问题有时命令需要用户确认(“按 Y 继续”)

图书馆可以吗?

4

1 回答 1

1

通常,大多数 Java SSH API 留给开发人员来解决在 shell 中执行多个命令的复杂性。这是一个复杂的问题,因为 SSH 不提供任何指示命令在 shell 中的开始和结束位置;该协议仅提供数据流,即 shell 的原始输出。

我想介绍一下我的项目Maverick Synergy。为交互式 shell 提供接口的开源 API (LGPL)。我在一篇文章中记录了交互式命令的选项。

这是一个非常基本的例子,ExpectShell 类允许你执行多个命令,每次返回一个封装了命令输出的 ShellProcess。您可以使用 ShellProcess InputStream 读取输出,当命令完成时它将返回 EOF。

如本例所示,您还可以使用 ShellProcessController 与命令交互。

SshClient ssh = new SshClient("localhost", 22, "lee", "xxxxxx".toCharArray());

ssh.runTask(new ShellTask(ssh) { 
    protected void onOpenSession(SessionChannelNG session) 
         throws IOException, SshException, ShellTimeoutException { 

         ExpectShell shell = new ExpectShell(this);

         // Execute the first command
         ShellProcess process = shell.executeCommand("ls -l");
         process.drain();
         String output = process.getCommandOutput();

         // After processing output execute another
         ShellProcessController controller =  
               new ShellProcessController(
                  shell.executeCommand("rm -i file.txt"));              

         if(controller.expect("remove")) {         
             controller.typeAndReturn("y");     
         }           

         controller.getProcess().drain();
   }
});

ssh.disconnect();
于 2020-02-18T23:32:05.363 回答