linux - specified - ¿Cómo corregir ''sudo: no tty presente y no se especificó el programa askpass'' error?
standard in must be a tty (21)
Estoy tratando de compilar algunas fuentes usando un makefile. En el archivo make hay un montón de comandos que deben ejecutarse como sudo
.
Cuando compilo las fuentes de un terminal, todo va bien y la marca se detiene la primera vez que se ejecuta un comando sudo
esperando la contraseña. Una vez que escribo la contraseña, hago reanudar y completar.
Pero me gustaría poder compilar las fuentes en NetBeans. Entonces, comencé un proyecto y le mostré a netbeans dónde encontrar las fuentes, pero cuando compilo el proyecto da el error:
sudo: no tty present and no askpass program specified
La primera vez que golpea un comando sudo
.
He buscado el problema en Internet y todas las soluciones que encontré apuntan a una cosa: deshabilitar la contraseña para este usuario. Dado que el usuario en cuestión aquí es root. No quiero hacer eso.
hay alguna otra solucion?
Asegúrese de que el comando que está sudo
sea parte de su PATH
.
Si tiene una entrada única (o multi, pero no ALL) de sudoers
comando, obtendrá el sudo: no tty present and no askpass program specified
cuando el comando no forma parte de su ruta (y no se especifica la ruta completa) .
Puede solucionarlo agregando el comando a su PATH
o invocándolo con una ruta absoluta, es decir,
sudo /usr/sbin/ipset
En lugar de
sudo ipset
Creo que puedo ayudar a alguien con mi caso.
Primero, cambié la configuración del usuario en /etc/sudoers
refiriéndose a la respuesta anterior. Pero todavía no funcionó.
myuser ALL=(ALL) NOPASSWD: ALL %mygroup ALL=(ALL:ALL) ALL
En mi caso, myuser
estaba en el mygroup
. Y no necesitaba grupos. Por lo tanto, eliminado esa línea. (No debería eliminar esa línea como yo, solo marca el comentario).
myuser ALL=(ALL) NOPASSWD: ALL
¡Funciona!
Después de todas las alternativas, encontré:
sudo -S <cmd>
La opción -S (stdin) hace que sudo lea la contraseña de la entrada estándar en lugar del dispositivo terminal.
El comando sudo
falla al intentar solicitar una contraseña de root y no hay ningún pseudo-tty asignado (ya que forma parte del script).
Debe iniciar sesión como root para ejecutar este comando o configurar las siguientes reglas en su /etc/sudoers
(o: sudo visudo
):
# Members of the admin group may gain root privileges.
%admin ALL=(ALL) NOPASSWD:ALL
A continuación, asegúrese de que su usuario pertenece al grupo de admin
(o wheel
).
Lo ideal sería (más seguro) limitar los privilegios de root a comandos específicos que se pueden especificar como %admin ALL=(ALL) NOPASSWD:/path/to/program
Este error también puede surgir cuando intenta ejecutar un comando de terminal (que requiere una contraseña de root) desde algún script que no sea de shell, por ejemplo, sudo ls
(en backticks) desde un programa Ruby. En este caso, puede usar la utilidad Expect ( http://en.wikipedia.org/wiki/Expect ) o sus alternativas.
Por ejemplo, en Ruby para ejecutar sudo ls
sin obtener sudo: no tty present and no askpass program specified
, puede ejecutar esto:
require ''ruby_expect''
exp = RubyExpect::Expect.spawn(''sudo ls'', :debug => true)
exp.procedure do
each do
expect "[sudo] password for _your_username_:" do
send _your_password_
end
end
end
[esto usa una de las alternativas para esperar la extensión TCL: ruby_expect gema].
Esto funcionó para mí:
echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
donde tu usuario es "myuser"
para una imagen de Docker, eso sería:
RUN echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
Inicia sesión en tu linux. Fuego siguiendo órdenes. Tenga cuidado, ya que editar sudoer es una propuesta arriesgada.
$ sudo visudo
Una vez que vi editor abre los siguientes cambios:
Comentario fuera de
Defaults requiretty
# Defaults requiretty
Ir al final del archivo y añadir
jenkins ALL=(ALL) NOPASSWD: ALL
La ejecución de scripts de shell que contienen comandos sudo en ellos desde jenkins podría no ejecutarse como se esperaba. Para arreglar esto, sigue adelante
Pasos simples:
En sistemas basados en Ubuntu, ejecute "$ sudo visudo"
Esto abrirá el archivo / etc / sudoers.
- Si su usuario jenkins ya está en ese archivo, modifíquelo para que se vea así:
jenkins ALL = (ALL) NOPASSWD: ALL
guarda el archivo
Relanzar su trabajo jenkins
no deberías ver ese mensaje de error otra vez :)
Nadie dijo qué podría causar este error, en caso de migración de un host a otro, recuerde acerca de la verificación del nombre de host en el archivo sudoers:
Así que esta es mi / etc / sudoers config
User_Alias POWERUSER = user_name
Cmnd_Alias SKILL = /root/bin/sudo_auth_wrapper.sh
POWERUSER hostname=(root:root) NOPASSWD: SKILL
si no coincide
uname -a
Linux other_hostname 3.10.17 #1 SMP Wed Oct 23 16:28:33 CDT 2013 x86_64 Intel(R) Core(TM) i3-4130T CPU @ 2.90GHz GenuineIntel GNU/Linux
aparecerá este error:
No hay tty presente y no se ha especificado ningún programa de paso de entrada
Otorgar al usuario el uso de ese comando sin pedir contraseña debe resolver el problema. Primero abre una consola shell y escribe:
sudo visudo
Luego edite ese archivo para agregar al final:
username ALL = NOPASSWD: /fullpath/to/command, /fullpath/to/othercommand
p.ej
john ALL = NOPASSWD: /sbin/poweroff, /sbin/start, /sbin/stop
permitirá al usuario ''john'' apagar sudo, iniciar y detener sin que se le solicite la contraseña.
Mire en la parte inferior de la pantalla las pulsaciones de teclado que necesita usar en visudo (esto no es vi) y salga sin guardar nada al primer signo de cualquier problema. Advertencia de salud: la corrupción de este archivo tendrá graves consecuencias, ¡edite con cuidado!
Otras opciones, no basadas en NOPASSWD:
- Inicie Netbeans con privilegios de raíz ((sudo netbeans) o similar) que presumiblemente mantendrán el proceso de construcción con la raíz y, por lo tanto, sudo se ejecutará automáticamente.
- Realice las operaciones que necesita para realizar suexec: haga que sean propiedad de root y establezca el modo en 4755. (Esto, por supuesto, permitirá que cualquier usuario de la máquina los ejecute). De esa manera, no necesitan sudo en absoluto.
- Crear archivos de disco duro virtual con sectores de arranque no debería necesitar sudo en absoluto. Los archivos son solo archivos, y los sectores de arranque son solo datos. Incluso la máquina virtual no debería necesariamente necesitar root, a menos que haga un reenvío avanzado de dispositivos.
Para la referencia, en caso de que alguien más encuentre el mismo problema, me quedé atascado durante una buena hora con este error que no debería ocurrir ya que estaba usando el parámetro NOPASSWD.
Lo que NO sabía era que sudo puede generar exactamente el mismo mensaje de error cuando no hay tty y el comando que el usuario intenta iniciar no forma parte del comando permitido en el archivo / etc / sudoers.
Aquí un ejemplo simplificado de mi contenido de archivo con mi problema:
bguser ALL = NOPASSWD: /
command_a arg_a, /
command_b arg_b /
command_c arg_c
Cuando bguser intentará lanzar "sudo command_b arg_b" sin ningún tty (se está usando bguser para algún demonio), aparecerá el error "no tty presente y no se ha especificado ningún programa de paso de contraseña".
¿Por qué?
Debido a que falta una coma al final de la línea en el archivo / etc / sudoers ...
(Incluso me pregunto si este es un comportamiento esperado y no un error en sudo, ya que el mensaje de error correcto para tal caso debería ser "Lo siento, el usuario bguser no puede ejecutar, etc.")
Para usuarios de Ubuntu 16.04.
Hay un archivo que tienes que leer con:
cat /etc/sudoers.d/README
Colocar un archivo con el modo 0440 en /etc/sudoers.d/myuser con el siguiente contenido:
myuser ALL=(ALL) NOPASSWD: ALL
Debería arreglar el problema.
No olvides:
chmod 0440 /etc/sudoers.d/myuser
Prueba este:
echo '''' | sudo -S my_command
Recibía este error porque había limitado a mi usuario a un solo ejecutable ''systemctl'' y había configurado mal el archivo visudo.
Esto es lo que tuve:
jenkins ALL=NOPASSWD: systemctl
Sin embargo, debe incluir la ruta completa al ejecutable, incluso si está en su ruta de forma predeterminada, por ejemplo:
jenkins ALL=NOPASSWD: /bin/systemctl
Esto permite a mi usuario jenkins reiniciar los servicios pero no tener acceso completo a la raíz
Si por casualidad viniste aquí porque no puedes sudo dentro del Ubuntu que viene con Windows10
Edite el archivo / etc / hosts desde Windows (con el Bloc de notas), se ubicará en:
%localappdata/lxss/rootfs/etc
, agregue127.0.0.1 WINDOWS8
, esto eliminará el primer error que no pueda encontrar el anfitrión.Para deshacerse del error
no tty present
, siempre hagasudo -S <command>
Tal vez la pregunta no esté clara de por qué ninguna respuesta fue igual a ella, pero tuve el mismo mensaje de error cuando intentaba montar sshfs que requería sudo: el comando es algo como esto:
sshfs -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" [email protected]:/var/www /mnt/sshfs/www
añadiendo la opción -o debug
sshfs -o debug -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" [email protected]:/var/www /mnt/sshfs/www
Tuve el mismo mensaje de esta pregunta:
sudo: no tty present and no askpass program specified
Entonces, leyendo la respuesta de otros, llegué a hacer un archivo en /etc/sudoer.d/user
en my.server.tld con:
user ALL=NOPASSWD: /usr/lib/openssh/sftp-server
y ahora puedo montar la unidad sin dar demasiado derecho adicional a mi usuario.
Tratar:
Usar la línea
NOPASSWD
para todos los comandos, quiero decir:jenkins ALL=(ALL) NOPASSWD: ALL
Ponga la línea después de todas las otras líneas en el archivo
sudoers
.
Eso me funcionó (Ubuntu 14.04).
Tratar:
ssh -t remotehost "sudo <cmd>"
Esto eliminará los errores anteriores.
sudo
por defecto leerá la contraseña del terminal adjunto. Su problema es que no hay un terminal conectado cuando se ejecuta desde la consola de netbeans. Entonces, tiene que usar una forma alternativa de ingresar la contraseña: eso se llama el programa askpass .
El programa askpass no es un programa en particular, sino cualquier programa que pueda solicitar una contraseña. Por ejemplo, en mi sistema x11-ssh-askpass
funciona bien.
Para hacerlo, debe especificar qué programa usar, ya sea con la variable de entorno SUDO_ASKPASS
o en el archivo sudo.conf
(consulte man sudo
para obtener más información).
Puede forzar a sudo
a usar el programa askpass usando la opción -A
. Por defecto, lo usará solo si no hay un terminal conectado.
En Jenkins :
echo ''<your-password>'' | sudo -S command
Por ejemplo :
echo ''******'' | sudo -S service nginx restart
Puede usar el complemento de contraseña de máscara para ocultar su contraseña