Java – Running a command using an “exec” channel with JSch returns no output

Running a command using an “exec” channel with JSch returns no output… here is a solution to the problem.

Running a command using an “exec” channel with JSch returns no output

I’m trying to execute commands on a Linux server using SSH from Android using JSch.

As far as I know, I’m connecting to the server, but when I try to retrieve the results of the command, I get nothing.

Connect to server:

public class SSHCommand {

public static String executeRemoteCommand(
            String username,
            String password,
            String hostname,
            int port) throws Exception {

JSch jsch = new JSch();
        Session session = jsch.getSession(username, hostname, port);
        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();

return baos.toString();
    }
}

Retrieve data:

public class MainActivity extends Activity {

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final String TAG = "TESTING";

new AsyncTask<Integer, Void, Void>(){
            @Override
            protected Void doInBackground(Integer... params) {
                try {
                    Log.d(TAG, SSHCommand.executeRemoteCommand("username", "password", "192.168.0.1", 22));
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }
        }.execute(1);
    }
}

What am I missing here?

Solution

As soon as you start the command, you disconnect immediately before returning any output.

You must wait for the “exec” channel to close (it closes after the command completes).

See also official JSch example for the “exec” channel

byte[] tmp=new byte[1024];
while(true){
  while(in.available()>0){
    int i=in.read(tmp, 0, 1024);
    if(i<0)break;
    System.out.print(new String(tmp, 0, i));
  }
  if(channel.isClosed()){
    if(in.available()>0) continue; 
    System.out.println("exit-status: "+channel.getExitStatus());
    break;
  }
  try{Thread.sleep(1000); }catch(Exception ee){}
}

Although allowing commands to complete reliably and collect all output, including errors, see How to read JSch command output?

Related Problems and Solutions