当前位置: 首页 > 知识库问答 >
问题:

JSch中断命令正在执行

邓焱
2023-03-14

我有一个带有两个按钮的swing应用程序,用于运行和停止执行JSch命令。所以我有下一个方法,当我们点击开始按钮时调用:

public String executeSSHCommand(String pattern, String listFiles) {             
    searchRez = new StringBuilder();        
    BufferedReader br = null;
    String line, cmd = null;
    // adding ' symbol to pattern
    pattern = "'"+pattern+"'";       
    //
    try {
        Channel channel = session.openChannel("exec");            
        cmd = "zgrep " + pattern + " " + listFiles;
        log.debug("Executing next ssh command: " + cmd);                        
        ((ChannelExec)channel).setCommand(cmd);                        
        channel.setInputStream(null);
        ((ChannelExec)channel).setErrStream(System.err);             
        InputStream in=channel.getInputStream();
        channel.connect();
        // read server output
        br = new BufferedReader(new InputStreamReader(in));
        while(true && !isCancel){               
          while ((line = br.readLine()) != null && !isCancel) {                        
            searchRez.append(line+"\n");                        
          }                         
          if(channel.isClosed()){
              log.debug("Exit status for execute ssh command is " + channel.getExitStatus());                
            break;
          }
          try{Thread.sleep(1000);}catch(Exception ee){log.error(ee);}
        }

        if (isCancel) {
            log.debug("Search was canceled by user... ");                

            channel.setInputStream(null);                
            if (in != null) {
                in.close();
                in = null;
            }
            if (br != null) {
                br.close();
                br = null;
            }
            try{Thread.sleep(1000);}catch(Exception ee){log.error(ee);}
        }
        //
        channel.disconnect();   
        session.disconnect();         
        log.debug("Search pattern in log file is complete.");
    } catch (Exception ex) {
        log.error(ex);
    }               
    log.debug("Rezult string has next value: " + searchRez.toString());
    return searchRez.toString();
}

正如你上面看到的,我们有is取消变量,它是布尔变量,当点击停止按钮时,我们将其设置为false。所以我的问题是当用户点击停止按钮和通道与会话成为断开,zgrep表达式继续工作在服务器上。我认为channel.disconnect()应该停止我在服务器上运行的所有命令,有人能建议如何解决这个问题吗?谢谢。

共有2个答案

宰鸿博
2023-03-14

除了将pty设置为true,您还可以简单地使用:

((ChannelExec) channel).sendSignal("INT"); // may throw Exception

即使您已经调用了out.close();(out涉及正在运行的命令的stdin),也可以这样做。

尉迟阳煦
2023-03-14

@dic19给了我一个主意,在断开通道和会话之前向服务器发送Ctrl C命令,以便中断服务器端的zgrep命令执行。

我在JSch邮件列表中找到了这篇文章,它帮助我解决了我的问题。

因此,要发送Ctrl C命令,您应该为通道对象((ChannelExec)通道启用puty模式。setPty(true);并将3值写入通道OutputStream:

        ((ChannelExec)channel).setPty(true);
        ((ChannelExec)channel).setCommand(cmd);                        
        channel.setInputStream(null);
        ((ChannelExec)channel).setErrStream(System.err);             
        InputStream in=channel.getInputStream();
        OutputStream out = channel.getOutputStream();
        channel.connect();
        ...........
        if (isCancel) {
            log.debug("Search was canceled by user... ");                

            channel.setInputStream(null);                
            if (in != null) {
                in.close();
                in = null;
            }
            if (br != null) {
                br.close();
                br = null;
            }
            out.write(3);
            out.flush();
            try{Thread.sleep(1000);}catch(Exception ee){log.error(ee);}
        }
 类似资料:
  • 为什么/我的目标: 我有一个由pi组成的小型网状网络,每天大部分时间都在运行脚本。我想取消停机时间,但是代码有时会在连续循环3-4天后停止工作,(有时长达一周,代码才会出现错误并停止)。 每个节点上运行的脚本用“最后签入”字段更新mySQL数据库。 我希望用Java编写一个小型后台程序,它将在我的服务器上无限期运行,时不时地检查每个站点的“最后签入”,如果它注意到一个节点宕机,远程ssh进入该节点

  • 我能够使用Jsch连接shell通道,然后我必须执行后续命令,我已经阅读了下面的帖子通过Jsch Shell执行多个命令 我已经试过了,如下所示 但是cmd1是UNIX服务器登录脚本,所以即使我用putty给出下面的命令 我无法在一个实例中执行所有三个,只有cmd1正在执行,因此也不能使用Jsch。 因为cmd1是用于登录的,所以通常我会在puty中执行cmd1,然后一旦登录到unix服务器,我就

  • 我使用java ssh客户端(http://www.jcraft.com/jsch/)连接到远程机器并执行命令。代码工作正常,直到我连接到远程机器并执行命令。然而,问题是,即使命令执行成功,通道和会话也不会断开。 我也打电话给session.disconnect和channel.disconnect,但仍然是问题所在。 这是我的代码: 请建议

  • 我试图在unix中使用JSCHSSH类(com.jcraft.jsch)执行一些工具。我的工具有一个选择菜单。我需要转到工具所在的文件夹,执行它并选择请求的选项。在每个命令之后,(cd,execute,…)我希望检查输出并检查状态代码(0/1)。我有下面的代码按预期执行它,但在这段代码中,我找不到一种方法来检查每个命令后的输出。 我无法找到一种方法,但我怎么能分开的命令,并打印他们一个接一个(在同

  • 我正在从事一个项目,其中我打算制作一个JavaGUI应用程序,该应用程序连接到ssh服务器并在服务器上执行远程命令。我愿意使用JSch库。我的目标是制作按钮和文本字段,让用户能够轻松发送命令和获得回复。我的意思是,用户不会打开xShell并提示“grep”hi“/usr/file.txt”,而是从列表中选择路径,在文本字段中输入“hi”,然后按下grep按钮。 问题是,我找不到一个在一个会话中执行