代码之家  ›  专栏  ›  技术社区  ›  Omid1989

如何在Android中读取jsch命令的输出?

  •  0
  • Omid1989  · 技术社区  · 7 年前

    我正在使用JSCH库构建一个android应用程序,在远程linux服务器上执行命令,然后读取其输出。

    我遵循了 this question ,但没有解决我的问题。

    以下是我的活动代码:

    package com.example.pic_controller_2;
    
            import android.graphics.drawable.Drawable;
            import android.support.v7.app.AppCompatActivity;
            import android.os.Bundle;
            import android.app.Activity;
            import java.io.BufferedInputStream;
            import java.io.BufferedOutputStream;
            import java.io.ByteArrayOutputStream;
            import java.io.File;
            import java.io.FileOutputStream;
            import java.io.OutputStream;
            import com.jcraft.jsch.Channel;
            import com.jcraft.jsch.ChannelExec;
            import com.jcraft.jsch.JSch;
            import com.jcraft.jsch.JSchException;
            import com.jcraft.jsch.Session;
            import com.jcraft.jsch.ChannelSftp;
            import android.view.View;
            import android.os.AsyncTask;
            import android.widget.Button;
            import android.widget.ImageView;
            import android.widget.Toast;
    
    public class TestActivity extends AppCompatActivity {
    
        private String aaaa;
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_test);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        }
    
        public void show_picture_func (View v) {   
    
            new AsyncTask<Integer, Void, Void>(){    
    
                @Override
                protected Void doInBackground(Integer... params) {
    
                    String SFTPHOST = "192.168.0.1";
                    int SFTPPORT = 22;
                    String SFTPUSER = "pi";
                    String SFTPPASS = "raspberry";
                    String SFTPWORKINGDIR = "/home/pi/pic/";
    
                    Session session = null;
                    Channel channel = null;
                    ChannelSftp channelSftp = null;
    
                    try {
                        JSch jsch = new JSch();
                        session = jsch.getSession(SFTPUSER, SFTPHOST, SFTPPORT);
                        session.setPassword(SFTPPASS);
                        session.setConfig("StrictHostKeyChecking", "no");
                        session.setTimeout(10000);
                        session.connect();
    
                        ChannelExec channel1 = (ChannelExec)session.openChannel("exec");
                        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
                        channel1.setOutputStream(baos);
                        channel1.setCommand("ls /home/pi/pic | sed -n 5p");
                        aaaa = new String(baos.toByteArray());
    
                    } catch (Exception ex) {
                        ex.printStackTrace();
                        Toast.makeText(getApplicationContext(), "Error Connecting", Toast.LENGTH_LONG).show();
                    }
                    return null;
                }
    
    
                @Override
                protected void onPostExecute(Void unused) {
                    TextView textView1_2 = (TextView)findViewById(R.id.textView1);
                    textView1_2.setText(aaaa);
                }
    
    
            }.execute(1);
    
        }
    
    }
    

    因此,已执行命令的输出应显示在textview中。但事实并非如此。textview变为白色!

    有什么建议吗!?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Omid1989    7 年前

    我更改了代码的以下部分:

    ChannelExec channel1 = (ChannelExec)session.openChannel("exec");
    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    channel1.setOutputStream(baos);
    channel1.setCommand("ls /home/pi/pic | sed -n 5p");
    aaaa = new String(baos.toByteArray());
    

    为此:

    ChannelExec channel1 = (ChannelExec)session.openChannel("exec");
    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    channel1.setOutputStream(baos);
    channel1.setCommand("ls /home/pi/pic | sed -n 5p | xargs echo -n");
    channel1.connect();
    try{Thread.sleep(1000);}catch(Exception ee){}
    aaaa = new String(baos.toByteArray());
    

    问题解决了。