Ya había hecho esta pregunta en Stack Overflow , pero me han pedido que la publique aquí. Entonces haciendo lo mismo.
Ejecuté este comando usando mi programa java
sudo -u <username> -S pwd
Tengo esta salida
command=sudo -u <username> -S pwd
exitCode=1
sudo: sorry, you must have a tty to run sudo
Intenté editar / etc / sudoers pero ya contiene
<username> ALL=(ALL) NOPASSWD: ALL
Luego, aprendí que esto se puede hacer comentando el siguiente código en / etc / sudoers
# Defaults requiretty
Además, de manera predeterminada, cuando intentamos ejecutar un comando como otro usuario sudo
, debemos proporcionar nuestra propia contraseña. Pero esto se puede cambiar haciendo el siguiente cambio en / etc / sudoers-
Defaults targetpw
Mi pregunta es, ¿ es posible ejecutar mi comando anterior en Java sin hacer ningún cambio en ningún lugar, es decir, tener la configuración predeterminada ?
requiretty
está habilitada de forma predeterminada. Segúnsudo
la propia documentación , está "desactivado por defecto".Respuestas:
No sé cómo ejecutar comandos de shell en Java, pero eche un vistazo a la opción -t para el comando ssh
Eso es lo que hago cuando necesito ejecutar el comando como root sobre ssh (deshabilitar el inicio de sesión de root directo y tty requerido por sudo)
fuente
La respuesta corta es no, necesitará cambiar la configuración para que sudo haga las cosas de manera diferente a como lo hace actualmente.
sudo puede ser la herramienta incorrecta para esto. Las reglas de Sudo están ahí para ayudar a los administradores del sistema a configurar una forma de obtener privilegios elevados que son difíciles de abusar para obtener privilegios adicionales / no deseados.
Si considera lo que sudo hace por usted:
Si desea que su Java ejecute comandos arbitrarios como usuarios arbitrarios sin proporcionar una contraseña para esos usuarios o para los suyos, esencialmente está reemplazando sudo. En ese caso, debe crear sus propias reglas sobre cómo prevenir el abuso.
Básicamente hay dos formas de hacer esto:
En el caso del n. ° 1, su programa Java está ejecutando lo que hace sudo, y debe implementar su propio conjunto de reglas para protegerse del abuso.
Hay otros programas además de sudo para hacer # 2. Un ejemplo se puede encontrar en https://code.google.com/archive/p/exec-wrapper/downloads
Este útil script de shell crea un programa en C para ejecutar otro comando (generalmente un script). Luego compila el programa C en un binario y marca esa raíz setuid o realmente podría ser setuid para cualquier usuario. (modo: 4555 y propietario: root)
Mientras esté en un sistema de archivos que lo permita, la ejecución del programa binario ejecutará el comando configurado como el ID de usuario que posee el programa binario.
fuente