2009-06-18 9 views
13

Intentando escribir un programa Java capaz de ejecutar un comando UNIX como un usuario diferente de UNIX. Tengo la contraseña del usuario y sé el comando que quiero ejecutar, pero el comando debe ejecutarse como ese usuario, así que primero tengo que iniciar sesión como ese usuario.Ejecución de comandos UNIX como usuario diferente, desde Java

Por ejemplo: supongamos que tenemos un usuario, jim, que quiere ver lo que está en el directorio de inicio de bob, y (por alguna razón) jim tiene acceso para ejecutar ls mientras que bob no lo tiene. Actualmente estamos conectados como bob. Esto es lo que (podríamos) hacer:

[email protected]$ su jim && ls ~bob 

El problema es que nos piden la contraseña de jim. Dado que este se ejecuta desde un programa Java, es decir

Process p = Runtime.getRuntime().exec("su jim && ls ~bob"); 

consigue Nos le pregunte la contraseña de Jim y colgó. Conocemos la contraseña de jim. Sin embargo, no puedo ingresar.

Además, no podemos usar un script Expect (no lo tenemos instalado) y no podemos convertirnos en el superusuario. También he mirado en el uso de SSH para probar esto, ya que podíamos hacer técnicamente

[email protected]$ ssh [email protected] "ls ~bob" 

pero esto tampoco funciona, ya que no tengo permiso para SSH sin contraseña de configuración.

Mi último esfuerzo es intentar usar una biblioteca SSH para Java, ya que la contraseña está disponible para el programa Java y podría iniciar sesión con eso (y ejecutar el comando correcto). Pero dado que voy a ejecutar en el mismo host, parece excesivo.

¿Alguna sugerencia?

P.S: Java versión 1.4.2, no se puede actualizar; AIX UNIX 5.3.

+0

¿fue capaz de encontrar una solución sin usar una biblioteca de terceros? Si es así, ¿puede compartirla? – HyperioN

Respuesta

6

Problema resuelto. Usó JSch (http://www.jcraft.com/jsch/) en SSH en el servidor con nombre de usuario y contraseña conocidos, y ejecuta el comando. Gracias a todos por sus sugerencias!

+0

por favor agregue un ejemplo aquí. – vijendra

7

Tenga sudo instalado, haga que el usuario ejecute el programa Java ingresado en/etc/sudoers para los comandos en cuestión, y use sudo -u jim ls ~bob.

+0

Esto no es una solución. Lamentablemente, no puedo modificar el sistema de ninguna manera, incluida la instalación de sudo. –

+2

Necesita cambiar de host entonces. –

+0

De acuerdo con Andrew. Si su anfitrión no le permite cosas como pubkey SSH, y ni siquiera puede instalar "sudo", entonces es probable que se le ocurra cualquier cosa con respecto a su esquema "su", aunque tal vez sea posible, no esté permitido por su proveedor de servicios. tampoco, y estás obligado a problemas. Encuentra un hoster que te permita sudo, se trata de la única solución sensata. – DevSolar

0

¿Posiblemente una implementación de Java de Expect? ExpectJ aparece cuando se busca en Google, pero no pude encontrar ninguna documentación sobre la ejecución en 1.4.2.

+0

Esto podría ser una solución. Gracias por el consejo. –

+0

Bueno, ExpectJ parece que debería funcionar: logró copiar y crear las dependencias. El problema es, sin embargo, ExpectJ usa StringBuilder, que no se implementó hasta 1.5. ¿Alguna sugerencia? –

+0

Puedes preguntarle a las personas de ExpectJ si tienen una versión anterior (no hay ninguna en sourceforge). Si el único problema es StringBuilder, debería poder modificar el código usted mismo. –

0

¿Ha intentado redireccionar los comandos sudo de entrada y escribir a eso. No he usado Java desde hace un tiempo, pero creo que hay una manera de obtener el flujo de entrada y escribir en él. Puede usar eso para escribir la contraseña seguida de una nueva línea y sudo o su debe aceptar la contraseña.

Use getInputStream() y escriba su contraseña a eso.

su jim -c ls ~Bob 
-1

Tal vez esto funcionaría:

Process process = Runtime.getRuntime().exec("su jim && ls ~bob"); 

OutputStream standardInput = process.getOutputStream(); 
Writer standardInputWriter = new OutputStreamWriter(standardInput); 
standardInputWriter.write("password\n"); 
standardInputWriter.close(); 
+0

Gracias, pero no funcionó. He intentado algo similar antes, pero con casi el mismo resultado. –

-1

No estoy seguro de que este código:

Process p = Runtime.getRuntime().exec("su jim && ls ~bob"); 

se ejecutará en una cáscara, necesaria para evaluar la & &, es decir un comando de shell (/ bin/sh). Debería pasar el comando "ls ~ bob" a través de una línea de comando swith de su.Algo como:

su jim -c 'ls ~bob' 
+0

Mismo resultado que la respuesta anterior. –

+0

luego SSH imho es la única opción viable – dfa

Cuestiones relacionadas