0

我正在使用以下代码使用 JSCH 库获取命令的输出,

    public SSHOutputBean executeCommand(String cmd, int timeOut) {

            SSHOutputBean outputBean=new SSHOutputBean();
            Channel ch=null;
        try {
            ch= this.session.openChannel("exec");

            ChannelExec chExec= ((ChannelExec) ch);
            chExec.setErrStream(System.err);
            chExec.setInputStream(null);
            chExec.setCommand("reset;"+cmd);
            chExec.connect();
            outputBean.setInputStream( chExec.getInputStream());
            BufferedReader brInput = new BufferedReader(new InputStreamReader(outputBean.getInputStream()));
            outputBean.setErrorStream(chExec.getErrStream());
            BufferedReader brError = new BufferedReader(new InputStreamReader(outputBean.getErrorStream()));
            while (true) {
                try {

                    String result = brInput.readLine();
                    if (result == null)
                        break;
                    outputBean.getOutput().append(result+"\n");

                } catch (Exception ex) {
                        ex.printStackTrace();
                        break;
                }
            }

            while (true) {
                try {

                    String result = brError.readLine();
                    if (result == null)
                        break;
                    outputBean.getError().append(result+"\n");

                } catch (Exception ex) {
                        ex.printStackTrace();
                        break;
                }
            }

 if (chExec.isClosed()) {

                outputBean.setExitStatus(chExec.getExitStatus());

            }
            chExec.disconnect();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JSchException e){

            e.printStackTrace();
        }
        finally
        {
            if(ch!=null)
                ch.disconnect();
        }

    return outputBean;
}

问题是,如果客户端上的 bashrc 文件正在控制台上打印某些内容,那么每次我打开 ChannelExec 并运行命令时;命令执行时给出的输出包含命令的输出以及 bashrc 输出。我只想要命令的输出而不是 bashrc 打印。

例如,

如果我将以下代码放入 .bashrc 文件中

echo "欢迎用户"

如果我使用 jsch 运行命令,

SSHOutputBean sshOutputBean = ssh.executeCommand("uptime");

那么输出是,

欢迎用户(.bashrc 输出)

13:15:10 up 2 days, 1:53, 8 users, load average: 0.14, 0.06, 0.06(实际命令输出)

但我希望输出是

13:15:10 up 2 days, 1:53, 8 users, load average: 0.14, 0.06, 0.06(实际命令输出)

请帮忙!

4

1 回答 1

0

我假设您不能简单地将 .bashrc 更改为安静。如果您想隔离命令结果的输出,并在此之前忽略任何内容,那么 Exec 通道可能不是您的最佳选择。当您运行该命令时,输出的流将包含所有输出。

您可以尝试使用 shell。您可以让它连接并让您的流读取所有初始输出(即“欢迎用户”或 .bashrc 文件中的其他输出)。然后刷新流,然后执行命令并读入流,只看到命令本身的输出。

或者,您可以使用 channelExec 解决问题。使用 channel.setEnv(name, value) 设置 PS1 变量以包含一些分隔字符串。例如:

channel.setEnv("PS1","Command Starts Here::")

然后,您可以在分隔字符串“Command Starts Here::”的提示符下解析输出

于 2013-05-08T21:43:32.857 回答