我一直试图解决这个问题几个小时了,我似乎无法弄明白。我正在尝试使用JSch从Android手机SSH到Linux计算机。命令始终正常,但通道的输出通常为空。有时它会显示输出,但大部分时间都没有。这是我在网上找到的代码。
String userName = "user";
String password = "test123";
String connectionIP = "192.168.1.13";
JSch jsch = new JSch();
Session session;
session = jsch.getSession(userName, connectionIP, 22);
session.setPassword(password);
// Avoid asking for key confirmation
Properties prop = new Properties();
prop.put("StrictHostKeyChecking", "no");
session.setConfig(prop);
session.connect();
// SSH Channel
ChannelExec channelssh = (ChannelExec) session.openChannel("exec");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
channelssh.setOutputStream(baos);
// Execute command
channelssh.setCommand("ls");
channelssh.connect();
channelssh.disconnect();
RESULT = baos.toString();
结果通常是空的。如果我将命令更改为mkdir或类似的东西,则会在Linux计算机上显示文件,这使我相信命令部分正常工作。问题似乎在于ByteArrayOutputStream。我还通过终端在另一台计算机上测试了connectionip,用户名和密码,所以我知道凭据是正确的。我已经用Google搜索了这个问题,任何输入都会对我有所帮助!
答案 0 :(得分:3)
找到答案我正在阅读错误的信息流。对于有这个问题的其他人来说,这是正确的代码。
InputStream inputStream = channelssh.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null)
{
stringBuilder.append(line);
stringBuilder.append('\n');
}
return stringBuilder.toString();
答案 1 :(得分:0)
exec-channel将在另一个线程上运行,因此您需要在调用Channel#disconnect()之前等待其终止。