如何阅读JSch命令输出? [英] How to read JSch command output?

查看:84
本文介绍了如何阅读JSch命令输出?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下代码:

  JSch jsch = new JSch(); 
jsch.setKnownHosts(dotSshDir +/ known_hosts);
jsch.addIdentity(dotSshDir +/ id_rsa);

会话session = jsch.getSession(userName,hostname,22);
session.connect();

ChannelExec channel =(ChannelExec)session.openChannel(exec);
channel.setCommand(command);
channel.setInputStream(null);
channel.setErrStream(System.err);
Reader reader = new InputStreamReader(channel.getInputStream());

char [] buf = new char [1024];
int numRead;
while((numRead = reader.read(buf))!= -1){
String readData = String.valueOf(buf,0,numRead);
result.append(readData);
buf = new char [1024];
}

它正试图从阅读器上读取。我该如何解决?我该怎么做才能找到正在发生的事情?

解决方案

悬挂实际上是由于命令中的一些不平衡报价。



对于后代,最终代码(在处理其他一些问题之后)是:

  public String call(String hostname,String [] argv)抛出SubprocessException {
StringBuffer result = new StringBuffer();

会话session = null;
ChannelExec channel = null;

try {
// TODO:如果〜/ .ssh不存在,则发出友好错误。
String dotSshDir = System.getProperty(user.home)+/。shh;
String userName = System.getProperty(user.name);

// TODO:如果〜/ .ssh / known_hosts不存在,则发出友好错误。
jSch.setKnownHosts(dotSshDir +/ known_hosts);
// TODO:如果〜/ .ssh / id_rsa不存在,则发出友好错误。
jSch.addIdentity(dotSshDir +/ id_rsa);

session = jSch.getSession(userName,hostname,22);
session.connect();

channel =(ChannelExec)session.openChannel(exec);
channel.setCommand(Joiner.on()。join(argv));
channel.setInputStream(null);
InputStream stdout = channel.getInputStream();
InputStream stderr = channel.getErrStream();
channel.connect();

waitForChannelClosed(channel);

if(channel.getExitStatus()!= 0){
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stderr));
readAll(bufferedReader,result);

抛出新的异常(result.toString());
} else {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stdout));
readAll(bufferedReader,result);
}
} catch(例外e){
抛出新的SubprocessException(e);
} finally {
if(channel!= null){
channel.disconnect();
}

if(session!= null){
session.disconnect();
}
}

返回result.toString();
}


I have the following code:

JSch jsch = new JSch();
jsch.setKnownHosts(dotSshDir + "/known_hosts");
jsch.addIdentity(dotSshDir + "/id_rsa");

Session session = jsch.getSession(userName, hostname, 22);
session.connect();

ChannelExec channel = (ChannelExec) session.openChannel("exec");
channel.setCommand(command);
channel.setInputStream(null);
channel.setErrStream(System.err);
Reader reader = new InputStreamReader(channel.getInputStream());

char[] buf = new char[1024];
int numRead;
while ((numRead = reader.read(buf)) != -1) {
    String readData = String.valueOf(buf, 0, numRead);
    result.append(readData);
    buf = new char[1024];
}

It's hanging trying to read from the reader. How do I fix this? How do I go about hunting down what's happening?

解决方案

The hanging was actually due to some unbalanced quotes in the command.

For posterity, the final code (after dealing with some other issues) is:

public String call(String hostname, String[] argv) throws SubprocessException {
    StringBuffer result = new StringBuffer();

    Session session = null;
    ChannelExec channel = null;

    try {
        // TODO: Emit friendly error if ~/.ssh doesn't exist.
        String dotSshDir = System.getProperty("user.home") + "/.ssh";
        String userName = System.getProperty("user.name");

        // TODO: Emit friendly error if ~/.ssh/known_hosts doesn't exist.
        jSch.setKnownHosts(dotSshDir + "/known_hosts");
        // TODO: Emit friendly error if ~/.ssh/id_rsa doesn't exist.
        jSch.addIdentity(dotSshDir + "/id_rsa");

        session = jSch.getSession(userName, hostname, 22);
        session.connect();

        channel = (ChannelExec) session.openChannel("exec");
        channel.setCommand(Joiner.on(" ").join(argv));
        channel.setInputStream(null);
        InputStream stdout = channel.getInputStream();
        InputStream stderr = channel.getErrStream();
        channel.connect();

        waitForChannelClosed(channel);

        if (channel.getExitStatus() != 0) {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stderr));
            readAll(bufferedReader, result);

            throw new Exception(result.toString());
        } else {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stdout));
            readAll(bufferedReader, result);
        }
    } catch (Exception e) {
        throw new SubprocessException(e);
    } finally {
        if (channel != null) {
            channel.disconnect();
        }

        if (session != null) {
            session.disconnect();
        }
    }

    return result.toString();
}

这篇关于如何阅读JSch命令输出?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆