如何阅读JSch命令输出? [英] How to read JSch command output?
本文介绍了如何阅读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屋!
查看全文