【问题标题】:Using java jcabi SSH client (or other) to execute several commands in shell使用 java jcabi SSH 客户端(或其他)在 shell 中执行多个命令
【发布时间】:2020-02-18 21:40:43
【问题描述】:

我了解如何创建 ssh shell

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

我也知道如何运行命令

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

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

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

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

图书馆可以吗?

【问题讨论】:

    标签: ssh jcabi


    【解决方案1】:

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

    我想介绍一下我的项目Maverick Synergy。一个开源 API (LGPL),它确实为交互式 shell 提供了一个接口。我在article 中记录了交互式命令的选项。

    这里是一个非常基础的例子,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();
    

    【讨论】:

    • 感谢您的建议,它的代码看起来非常漂亮,但在给出的示例中,我只看到一个命令是删除文件,例如我如何运行 ls -l 并基于输出 rm 一个文件?
    • 我已经编辑了我的答案以显示 2 个命令,但是您可以按顺序执行任意数量的命令,唯一的要求是确保上一个命令已完成,这意味着在ShellProcess,或者保证进程的InputStream返回EOF。
    • 对不起,我什至无法安装它...我检查了文档,maven 坐标指向 maverick-synergy-client 版本 3.0.0,它不在 maven 上,在 com 下的 maven .sshtools 有 Maverick Legacy Client 版本 1.8.2 我试过这个,但它不是你指的那个......
    • 它目前是一个 SNAPSHOT 版本,您需要在其中添加 sonatype 快照存储库。我已经更新了项目页面上的文档以反映这一点。
    • 我在尝试执行 runTask 时总是超时(没有超时参数它只是挂起)任务在指定的超时之前没有完成
    猜你喜欢
    • 2010-10-30
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 2013-08-24
    相关资源
    最近更新 更多