2009-02-20 53 views
10

Scenerio: Me gustaría ejecutar comandos en máquinas remotas desde un programa Java a través de ssh (estoy usando OpenSSH en mi máquina de desarrollo). También me gustaría establecer la conexión ssh pasando la contraseña en lugar de configurar las claves como lo haría con 'esperar'.
Problema: Al intentar hacer la contraseña de 'esperar', el Proceso creado con ProcessBuilder parece no poder ver la solicitud de la contraseña. Cuando ejecuto comandos normales que no son ssh (por ejemplo, 'ls') puedo obtener las secuencias e interactuar con ellas sin problemas. Estoy combinando el error estándar y el estándar en una secuencia con redirectErrorStream(true);, así que no me falta un error estándar ... Cuando ejecuto ssh con la opción '-v', veo todo el registro en la transmisión pero no lo hago ver el mensaje. Esta es la primera vez que intento usar ProcessBuilder para algo como esto. Sé que sería más fácil usar Python, Perl o un buen viejo pero mi jefe quiere utilizar lo que estamos tratando de recuperar (archivos de registro remotos y secuencias de comandos en ejecución) dentro de un programa Java existente, así que estoy algo atrapado.Ejecutando comandos sobre ssh con Java

¡Gracias de antemano por la ayuda!

Respuesta

11

El aviso solo se puede mostrar cuando ssh está conectado a un TTY, lo que no ocurre en el caso de Java.

Probablemente haya una manera de proporcionar la contraseña en la línea de comandos en su aplicación ssh. Esa será la forma de superar el aviso.

Alternativamente, considere conectarse directamente al servidor host desde el código nativo de Java en lugar de ejecutar una aplicación externa. Hay a million libraries que hará esto.

+2

+2 para el Alternativamente, -1 para no ir allí primero (llamándolo "alternativamente"). Net sigue siendo un +1 :) –

+0

Recomiendo paramiko para java, sabiamente llamado jaramiko - http://www.lag.net/jaramiko/. originalmente en Python, ha sido portado a Java. facilitará el uso de la versión de Python cuando el jefe deja de funcionar :) – popcnt

2

La mayoría de los programas con mentalidad de seguridad no usan stdin/stdout para capturar contraseñas, sino que capturan el TTY o algún otro método equivalente.

7

En lugar de utilizar un programa ssh externa, por qué no utilizar una biblioteca de Java SSH:

dos me encontré con Google - que evitará el problema que openssh estará trabajando muy duro para evitar ingresar la contraseña en stdin - se abrirá la terminal directamente. esperar tiene que trabajar muy duro para simular una tty para poder trabajar.

4

¿Por qué no utilizar un cliente ssh de Java? This uno tiene licencia BSD, y hay más clientes en la lista here.

1

He utilizado el cliente trilead ssh con mucho éxito. También probé jsch (otro cliente java ssh) y el túnel al cliente ssh nativo bajo linux. Trilead fue de lejos el mejor.

+0

ya no es compatible –

0

Puede ejecutar comandos usando edtFTPj/PRO, así como realizar transferencias de archivos a través de SFTP. Es Java.

1

Eche un vistazo a la publicación recientemente publicada SSHD, que se basa en el proyecto Apache MINA.

6

enchufe: ver this ejemplo de ejecución de un comando a través de SSH usando sshj

1

Haciéndose eco de la sugerencia de otros para utilizar una biblioteca de Java SSH. Pero quería comentar sobre la respuesta de Cohen.Enviar su contraseña a través de la línea de comando cuando se establece la conexión es inseguro y tampoco está permitido por muchos servidores sshd (según la configuración).

Es posible que desee buscar la configuración de claves para esto, por lo que puede realizar comandos ssh entre las máquinas sin una contraseña.

Pasos básicos - uso de OpenSSH para crear un par de claves (lo he hecho RSA, pero sé que hay un método mejor ahora) - crear un directorio .ssh en la carpeta de inicio en el equipo de origen - crear una directorio .ssh en la carpeta de inicio en el equipo de destino - mantener su clave privada en la carpeta .ssh de su máquina de origen - copiar la clave pública en un archivo llamado authorized_keys en la carpeta .ssh del objetivo

Algunas instrucciones se pueden encontrar here