lo siento, debes tener un tty para ejecutar sudo

13

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 ?

AlwaysALearner
fuente
1
¿Es por eso que estabas pidiendo la alternativa más artificial para sudo ?
slhck
66
Parece una distribución específica si requirettyestá habilitada de forma predeterminada. Según sudola propia documentación , está "desactivado por defecto".
mpy

Respuestas:

3

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 sobre ssh (deshabilitar el inicio de sesión de root directo y tty requerido por sudo)

Pregunta y aprende
fuente
1
Si bien este enfoque podría resolver el problema a primera vista, no está claro en absoluto cómo se relaciona con la pregunta. ¿Podría explicarme más detalles?
Pabouk
1
+1 para resolver el problema sin necesidad de cambiar ninguna configuración predeterminada.
Lucas
1

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?

sudo -u -S pwd

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:

  1. solicita una contraseña para verificar la identidad
  2. elevar los privilegios
  3. luego, opcionalmente, obtenga privilegios como otro usuario
  4. registra sudo uso para obtener acceso o ejecutar comandos

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:

  1. ejecute su java con privilegios elevados y tome y devuelva cuidadosamente los privilegios que necesita (consulte las llamadas a funciones setuid () seteuid () C).
  2. ejecutar un programa externo para obtener privilegios elevados cuando los desee

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.

Señor hielo
fuente