Pregunta

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

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

bob@host$ su jim && ls ~bob

El problema es que se nos solicita la contraseña de Jim. Dado que esto se ejecuta desde un programa Java, es decir,

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

se nos solicita la contraseña de Jim y colgamos. Sabemos la contraseña de Jim . Sin embargo, no puedo ingresarlo.

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

bob@host$ ssh jim@host "ls ~bob"

pero esto tampoco funciona ya que no tengo permiso para configurar SSH sin contraseña.

Mi último esfuerzo es tratar de 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 adecuado). 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.

¿Fue útil?

Solución 2

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

Otros consejos

Instale sudo, 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 .

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

¿Has intentado redirigir la entrada de comandos sudo y escribir en eso? No he usado Java en mucho tiempo, pero creo que hay una manera de obtener la secuencia de entrada y escribir en ella. Puede usar eso para escribir la contraseña seguida de una nueva línea y sudo o su deberían aceptar la contraseña.

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

su jim -c ls ~Bob

Quizás 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();

No estoy seguro de este código:

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

se ejecutará en un shell, necesario para evaluar el & amp; & amp ;, que es un comando de shell (/ bin / sh). Debe pasar el comando "ls ~ bob" a través de una línea de comando swith de su. Algo así como:

su jim -c 'ls ~bob'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top