Ver la versión completa : [Ayuda] Monitorizar SSH en programa Java
Hola a todos, estoy haciendo una aplicación en la que en una de las funciones tiene que enviar un comando a un servidor Ssh y monitorizar la ejecución de ese comando.
Estoy utilizando la librería JSCH y el comando que envía es la ejecución de un Script por ejemplo "sh /var/bin/script".
Para monitorizar la respuesta utilizo un InputStream y un BufferedReader pero no obtengo nada de respuesta aunque si que se que el script se ha ejecutado correctamente porque puedo ver las tareas que se están ejecutando en el equipo remoto desde la terminal.
Pasa esto pero por ejemplo si el comando que envío es un "ls -l /var/bin" de ahí si que recibo respuesta.
En fin, a ver si me podéis echar una mano o sabéis de otras librerías que vayan más finas en este aspecto.
Tened en cuenta que el script a su vez escribe varios comandos distintos por lo que necesito monitorizar la respuesta de todos esos comandos.
Si no me he explicado bien decidmelo que ultimamente duermo poco :-/
Saludos, Nakio.
Si la respuesta a ls sí que la puedes leer, pero la de tu script no...
Pregunta tonta: ¿estás seguro de que tu script está escribiendo en la salida estándar y no en, qué sé yo, la de errores?
Ten en cuenta que cada uno de los comandos del script puede ir a una salida distinta.
Redirígelo todo a un log y termina con una cat del log, así como primera idea.
Buenas, la librería me da la opción de obtener estos InputStream:
getInputStream -> stdout
getExtInputStream -> ni zorra idea
getErrStream -> stderr
Probé y en ninguno de ellos recibo información...
dardo, es buena idea pero el script no termina de ejecutarse hasta que tu se lo digas por tanto vería la información a toro pasado no se si me explico...
Saludos y gracias, Nakio.
No es cuestión de qué es lo que lea la librería, sino dónde escriba tu script. Quizá el script está escribiendo en algún stream local al ordenador remoto que no se envía por SSH de ninguna manera :)
Actualmente el código que tengo es este:
ChannelExec channelExec = (ChannelExec)session.openChannel("exec");
channelExec.setInputStream(System.in);
channelExec.setOutputStream(System.out);
InputStream in = channelExec.getExtInputStream();
channelExec.setCommand("/var/bin/start_server.sh40");
channelExec.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String linea = null;
while ((linea = reader.readLine()) != null) {
System.out.println(linea);
}
channelExec.disconnect();
Saludos, Nakio.
Voy a hacerlo con un ChannelShell lo que no se como hacer para enviarle comandos...
Saludos, Nakio.
Actualmente el código que tengo es este:
channelExec.setInputStream(System.in);
channelExec.setOutputStream(System.out);
InputStream in = channelExec.getExtInputStream();
channelExec.setCommand("/var/bin/start_server.sh40");
channelExec.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
Hace un montón que no programo en Java, pero todas esas líneas no parecen tener sentido ninguno: ¿pones los streams a la entrada y salida estándar de tu aplicación y encima antes de hacer la conexión? No entiendo cómo eso puede funcionar, y si lo hace parece muy anti-ituitivo.
Creo que las líneas tienen que ser algo más similar a:
ChannelExec channelExec = (ChannelExec)session.openChannel("exec");
channelExec.setCommand("/var/bin/start_server.sh40");
channelExec.connect();
InputStream in = channelExec.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String linea = null;
while ((linea = reader.readLine()) != null) {
System.out.println(linea);
}
channelExec.disconnect();
Y no tocas para nada ni System.in ni System.out
Ap, recuerda que muchos streams de texto no se envían hasta que el otro lado escribe una nueva línea '\n'. ¿Estás seguro de que tu script start_server.sh40 escribe el caracter "\n"?
Ese script sh40 no es mio y funciona a la perfección. Los getInputStream y demás deben ir antes del connect porque una vez conectas con el SSH no puedes cambiar las propiedades del channelExec.
Saludos, Nakio.
Por definición "get" no cambia ninguna propiedad :)
Y no estoy diciendo que sh40 esté mal, sino que quizá no escribe en la salida estándar o no escribe un fin de línea al final de alguna línea. Por ejemplo, "wget" no lo hace ninguna de las dos cosas y no está mal escrito :D
Bueno, al menos de una forma sencilla no se puede hacer lo que tenía pensado. Ya conseguí redirigir la stdout al jTextArea pero la información solo la muestra cuando el ssh deja de recibir lineas, por lo tanto no puedo hacer la monitorización en tiempo real.
Ya veré como reencfoco el tema.
Saludos, Nakio.
Ya conseguí redirigir la stdout al jTextArea pero la información solo la muestra cuando el ssh deja de recibir lineas, por lo tanto no puedo hacer la monitorización en tiempo real.
Perdona si es muy obvio, pero recuerda que si la GUI y tu cliente de SSH están en el mismo thread, la GUI no se cambiará hasta que acabes de recibir líneas y dejes el thread en paz :)
¿Cómo solucionaste al final lo del cliente? Es que estoy realmente "pez" en Java y necesito recordarlo a marchas forzadas :D
Perdona si es muy obvio, pero recuerda que si la GUI y tu cliente de SSH están en el mismo thread, la GUI no se cambiará hasta que acabes de recibir líneas y dejes el thread en paz :)
¿Cómo solucionaste al final lo del cliente? Es que estoy realmente "pez" en Java y necesito recordarlo a marchas forzadas :D
Hola, están en threads distintos, y lo otro lo solucioné con un Printstream.
Saludos, Nakio.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.