3

几个小时以来,我一直试图找出这个问题,但我似乎无法弄清楚。我正在尝试使用 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();

RESULT 通常为空。如果我将命令更改为 mkdir 或类似的东西,文件会显示在 Linux 计算机上,这让我相信命令部分工作正常。问题似乎出在 ByteArrayOutputStream 中。我还通过终端在另一台计算机上测试了 connectionip、用户名和密码,所以我知道凭据是正确的。我已经用谷歌搜索了这个问题,任何输入都会对我有很大帮助!

4

2 回答 2

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();   
于 2013-02-14T20:58:51.680 回答
0

exec-channel 将在另一个线程上运行,因此您需要在调用 Channel#disconnect() 之前等待其终止。

于 2013-02-14T06:18:08.243 回答