
Ya había hecho esta pregunta enDesbordamiento de pila, pero me pidieron que lo publicara aquí. Entonces haciendo lo mismo.
Ejecuté este comando usando mi programa java.
sudo -u <username> -S pwd
Obtuve este resultado-
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 forma predeterminada, cuando intentamos ejecutar un comando como otro usuario usando 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 el comando anterior en Java sin realizar ningún cambio en ningún lugar, es decir, teniendo la configuración predeterminada??
Respuesta1
No sé cómo ejecutar comandos de shell en Java, pero eche un vistazo a la opción -t para el comando ssh
-t force pseudo-tty allocation.
Eso es lo que hago cuando necesito ejecutar el comando como root a través de ssh (inhabilitación del inicio de sesión directo como root y tty requerido por sudo)
Respuesta2
Mi pregunta es, ¿es posible ejecutar el comando anterior en Java sin realizar ningún cambio en ningún lugar, es decir, teniendo la configuración predeterminada?
sudo -u -S contraseña
La respuesta corta es no, necesitarás 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 sea difícil de abusar para obtener privilegios adicionales o no deseados.
Si consideras lo que sudo hace por ti:
- solicita una contraseña para verificar la identidad
- elevar privilegios
- luego, opcionalmente, obtenga privilegios como otro usuario
- registra el uso de sudo para obtener acceso o ejecutar comandos
Si desea que Java ejecute comandos arbitrarios como usuarios arbitrarios sin proporcionar contraseñas ni para esos usuarios ni para los suyos, básicamente está reemplazando sudo. En ese caso, debes crear tus propias reglas sobre cómo prevenir el abuso.
Básicamente hay dos formas de hacer esto:
- Ejecute su Java con privilegios elevados y tome y devuelva cuidadosamente los privilegios que necesita (consulte setuid() seteuid() llamadas a funciones C).
- ejecute un programa externo para obtener privilegios elevados cuando los desee
En el caso número 1, su programa Java está realizando por sí mismo lo que hace Sudo y debe implementar su propio conjunto de reglas para protegerse contra abusos.
Hay otros programas además de Sudo para hacer el n.º 2. Un ejemplo se puede encontrar enhttps://code.google.com/archive/p/exec-wrapper/downloads
Este práctico script de shell crea un programa en C para ejecutar otro comando (normalmente un script). Luego compila el programa C en un binario y marca esa raíz setuid o, en realidad, podría ser setuid para cualquier usuario. (modo: 4555 y propietario: root)
Siempre que esté en un sistema de archivos que lo permita, al ejecutar el programa binario se ejecutará el comando configurado como el ID de usuario propietario del programa binario.