我正在使用JSch从路由器提取数据,但路由器提示的工作方式阻止我成功读取数据。
流程应该是这样的:
router>drop_into_privileged_mode
Password: password_entered_here
router#give_me_data
...Data goes here...
router#
我遇到的问题是,由于路由器在give_me_data之后退回到shell提示符,InputStream
永远不会死。自然的选择是运行give_me_data; exit;
或give_me_data && exit
之类的命令,但不幸的是路由器的操作系统不允许我链接这样的命令。同样令人沮丧的是,命令give_me_data需要很长时间才能运行,将exit
命令放入OutputBuffer不会执行任何操作(因为它在另一个命令仍在运行时被发送而不会被解释)。
我有没有办法保留InputStream的连接,但是杀了连接?如果可能,那么缓冲区将具有自然结束(因为连接已死),我可以将其复制到变量。或者,如果有一种方法可以将流中当前存在的所有信息传输出去,那么终止连接也会有效。
我尝试过类似StackOverflow问题中提出的解决方案,例如this one和this one无效。
此外,这里是我正在使用的代码(这是我设计的解决方案,它遇到了相同的阻塞问题):
InputStream in = channel.getInputStream(); //This gets the output from the router
byte[] buffer = new byte[1024];
StringBuffer stringBuffer = new StringBuffer();
while (true) {
while (in.available() > 0) {
int i = in.read(buffer, 0, 1024);
if (i < 0) {
break;
}
stringBuffer.append(new String(buffer, "UTF-8"));
}
System.out.println("done");
channel.disconnect(); // this closes the jsch channel
if (channel.isClosed()) {
if (in.available() > 0) {
continue;
}
System.out.println("exit-status: " + channel.getExitStatus());
break;
}
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}