Intento usar la biblioteca JSch – Java Canal Seguro hacer una conexión ssh en mi Android app, funciona.

Ahora me gustaría ejecutar un comando y recuperar el resultado.

He intentado varios métodos que mejor funciona es este. Sin embargo, este método sólo funciona en parte, porque por alguna razón que no puedo explicar, mi programa se detiene al final de mi ciclo while, sin embargo, yo soy el resultado de los comandos que aparece en mi registro.

Aquí está mi código :

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();

    Channel channel = session.openChannel("shell");
    channel.connect();

    DataInputStream dataIn = new DataInputStream(channel.getInputStream());  
    DataOutputStream dataOut = new DataOutputStream(channel.getOutputStream());  

    //send ls command to the server  
    dataOut.writeBytes("ls\r\n");  
    dataOut.flush();  

    //and print the response   
    String line = dataIn.readLine();
    String result = line + "\n";

    while ((line = dataIn.readLine()) != null) {
        result += line + "\n";
        Log.i("TAG", "Line: "+line);
    }

    dataIn.close();  
    dataOut.close();  
    channel.disconnect();  
    session.disconnect();

    return result;
}

¿Alguien más tiene una mejor manera de ejecutar un comando sheel con JSch?

Gracias de antemano !

2 Comentarios

  1. 6

    Su método se detiene en el circuito (en lugar de acabar) porque el control remoto de shell no se cierra el flujo de salida.
    No hay ninguna razón para ello, ya que no se podía enviar más comandos.

    Si sólo desea ejecutar un solo comando (o una serie de comandos conocido antes), no debería usar un Shell de canal, pero un «exec» de canal.

    De esta manera el shell remoto (el que se ejecuta el comando) terminará cuando el comando está terminado y, a continuación, el servidor va a cerrar la secuencia. Así que el bucle terminará, y, a continuación, puede cerrar los arroyos.

    Si usted piensa que necesita un intérprete de canal (por ejemplo, si usted necesita el fuego de varios comandos en el mismo contexto, y de reaccionar a la salida antes de decidir cuál sería el siguiente), usted necesitará alguna forma de saber cuando un comando es terminado (por ejemplo, mediante el reconocimiento del símbolo del sistema) y, a continuación, enviar el siguiente. Dejar de fumar, ya sea de cerca el flujo de salida o enviar un «cierre de sesión» o «salida» de comandos (ambos trabajan con cualquier estándar de shell de unix, otros shells necesitan diferentes comandos), entonces el sitio remoto debe cerrar el otro arroyo.

    Por el camino, mientras que la desactivación de estricta clave de host de la comprobación es conveniente, además, abre la conexión a un hombre en el ataque medio, y en el caso de la autenticación de contraseña, el atacante puede agarrar su contraseña. La forma correcta de hacerlo sería establecer un inicializado correctamente clave de host repositorio para reconocer el host remoto es la clave.

    • Genial, gracias por tu respuesta!
  2. -1

    Tan lejos como soy consciente de JSch es la única opción real.

    He encontrado que la Jsch errores tienden a tomar algo de investigación. Pero en la primera instancia que se quieren capturar e imprimir los errores como mínimo.

    try{ 
        JSch jsch = new JSch();
        Session session = jsch.getSession(username, hostname, port);
        ... omitted 
     } catch (Exception e) {
         System.out.println(e) 
     }

    también echa un vistazo a el código de ejemplo en el sitio

    • Gracias por tu respuesta, pero no contesta a mi pregunta. Intento hacer un sheel comando como «ls» y yo ya coger mi función cuando lo uso.

Dejar respuesta

Please enter your comment!
Please enter your name here