SSH输出始终为空。

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、用户名和密码,因此我知道凭据是正确的。我已经通过谷歌搜索了这个问题,任何输入都会对我有很大帮助!


“输出通常为空”是什么意思?考虑哪些命令会给出输出,哪些不会。如果您以用户的身份本地登录,ls是否会显示任何内容?它可能是一个空的主目录测试帐户吗? - Kjell Andreassen
输出的字符串值为""。我作为用户登录,只是为了这个问题摆脱了那些信息。当我从Linux计算机本身运行ls时,终端中会显示许多文件,但在此代码中不会显示。我已经尝试了许多其他命令,但都没有成功。 - John P.
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();   

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接