3

私はこの問題を何時間も理解しようとしてきましたが、理解できないようです。JSchを使用してAndroid携帯からLinuxコンピューターにSSHで接続しようとしています。コマンドは常に正常に機能しますが、チャネルの出力は通常空です。出力が表示されることもありますが、ほとんどの場合は表示されません。これが私がオンラインで見つけたコードです。

       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 に答える