¿Cómo reparar el error 'sudo: no hay tty presente y no se ha especificado el programa askpass'?

438

Estoy tratando de compilar algunas fuentes usando un archivo MAKE. En el archivo MAKE hay un montón de comandos que deben ejecutarse como sudo.

Cuando compilo las fuentes desde un terminal, todo va bien y la marca se detiene la primera vez que sudose ejecuta un comando esperando la contraseña. Una vez que escribo la contraseña, se reanuda y completa.

Pero me gustaría poder compilar las fuentes en NetBeans. Entonces, comencé un proyecto y mostré a netbeans dónde encontrar las fuentes, pero cuando compilo el proyecto me da el error:

sudo: no tty present and no askpass program specified

La primera vez que golpea un sudocomando.

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?

hebbo
fuente
3
Estoy compilando un sistema operativo de juguete. Necesito hacer algunas cosas para configurar la VM, incluida la creación de un disco duro virtual con sector de arranque.
hebbo
1
Ver también stackoverflow.com/q/20248009/873282
koppor
Como se señaló en serverfault.com/a/597268 , sudo -n my-commandfuncionó para mí. HIH!
andreyevbr 01 de
1
Por favor elige una respuesta.
ichimaru
1
@andreyevbr, no lo creo. sudo: a password is required
ichimaru

Respuestas:

260

Otorgar al usuario el uso de ese comando sin solicitar una contraseña debería resolver el problema. Primero abra una consola shell y escriba:

sudo visudo

Luego edite ese archivo para agregarlo 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 johnsudo poweroff, starty stopsin que se le solicite la contraseña.

Mire en la parte inferior de la pantalla las pulsaciones de teclas que necesita usar en visudo, por cierto, esto no es vi, y salga sin guardar a la primera señal de cualquier problema. Advertencia de salud: corromper este archivo tendrá graves consecuencias, edite con cuidado.

nicdaniau
fuente
44
Sí, la página de manual de sudoers me ha abierto los ojos sobre cómo se supone que realmente se debe usar sudo.
Spencer Williams el
66
visudo debería abrirse en cualquier EDITOR que su entorno esté configurado para usar, que muy bien podría ser (y debería ser ^ _ ^) vi.
Matt Styles
8
Asegúrese de que la línea de trazado NOPASSWD esté DESPUÉS de cualquier otra línea de sudo que pueda coincidir (como% wheel) que no tenga el indicador NOPASSWD.
Anthony
27
¡No puedo "sudo visudo" porque no puedo sudo en primer lugar!
Gubatron
8
Considere agregar un archivo a /etc/sudoers.d y dejar el archivo visudo intacto.
xlttj
183

Tratar:

  1. Use la NOPASSWDlínea para todos los comandos, quiero decir:

    jenkins ALL=(ALL) NOPASSWD: ALL
    
  2. Ponga la línea después de todas las otras líneas en el sudoersarchivo.

Eso funcionó para mí (Ubuntu 14.04).

Fatemeh Jabbari
fuente
13
Primero agregué la línea después de otras configuraciones de usuario, pero solo funcionó cuando se colocó como la última línea del archivo en lubuntu 14.04.1.
usuario77115
La segunda parte fue la solución que era lo que necesitaba. Una línea de configuración existente (para el grupo de ruedas) también coincidía con mi comando sudo pero sin la entrada NOPASSWD:. Colocar mi nueva línea después de que le dio la prioridad, no permite el uso de contraseña para el comando específico que necesitaba.
Anthony
55
Como @ user77115 había mencionado, esto solo funcionaba si lo colocaba como la última línea en el archivo sudoers, incluso con Ubuntu 16.04. Como nota al margen, otorgar permisos de sudo a jenkins para todos los comandos es una preocupación de seguridad bastante grande. Considere envolver sus scripts de jenkins y solo dar acceso a comandos específicos como: jenkins ALL=(ALL) NOPASSWD: /var/lib/jenkins/wrapper_script
ivandov
jenkinses solo un nombre de usuario? ¿Debe ser el nombre de usuario del usuario de la máquina host? ¿Qué sucede si el nombre de usuario en la máquina host coincide con el nombre de usuario del servidor remoto?
mrgloom
Esto es específico de Jenkins, parece que stackoverflow.com/a/22651598/1041319 es una solución más genérica.
arntg
167

Tratar:

ssh -t remotehost "sudo <cmd>"

Esto eliminará los errores anteriores.

usuario262129
fuente
77
-t Force pseudo-tty allocation. This can be used to execute arbitrary screen-based programs on a remote machinevea también: sudo-no-tty-present-and-no-askpass-program-especificado También sudo -Apermite configurar un sudoprograma askpass, pero solo veo GUI. ¿Alguien sabe un askpass para permitir ssh remotehost sudo -A askpass?
aquí
1
Corrección, El -Afor sudono toma argumentos y en su lugar requiere un entorno SUDO_ASKPASSo un sudo.conf So ssh remotehost sudo -A commandtodavía funcionaría. Todavía tengo curiosidad sobre un programa askpass basado en terminal.
aquí el
77
esto no funciona para mí (presumiblemente porque estoy llamando ssh desde un script), dándome el error Pseudo-terminal will not be allocated because stdin is not a terminal.:(
knocte
Funciona muy bien para mi. ¡Gracias!
xfra35
1
Esto no responde la pregunta.
bschlueter
126

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.

Fuente

El comando anterior aún necesita ingresar la contraseña. Para eliminar la contraseña ingresada manualmente, en casos como jenkins, este comando funciona:

echo <password> | sudo -S <cmd> 
Vingt Cent
fuente
Esto parece solucionar mi problema. ¿Pero hay algún efecto secundario al usar este comando?
Xiaodong Qi
3
sudo -S <command>- trueresulta ser un comando ficticio que devuelve un código de salida de 0 ( falsees un comando que devuelve 1). Gracias, esta es la única respuesta verdadera, ya que todos los demás esperan que "sudo" funcione.
Adam Plocher
1
-S: escriba la solicitud en el error estándar y lea la contraseña de la entrada estándar en lugar de usar el dispositivo terminal. La contraseña debe ir seguida de un carácter de nueva línea.
fileinster
Esto funciona de inmediato y puede hacer que sudo funcione hasta que se agote el tiempo de espera, pero no aborda los problemas subyacentes que puedan existir y el problema puede volver.
nealmcb
No sé si está funcionando pero se muestra, Password:entonces no pasa nada. No puedo escribir la contraseña.
ichimaru
43

sudode forma predeterminada, leerá la contraseña del terminal conectado. Su problema es que no hay una terminal conectada cuando se ejecuta desde la consola de netbeans. Por lo tanto, debe utilizar una forma alternativa de ingresar la contraseña: 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 sistemax11-ssh-askpass funciona bien.

Para hacerlo, debe especificar qué programa utilizar, ya sea con la variable de entorno SUDO_ASKPASSo en el sudo.confarchivo (consulteman sudo detalles).

Puede forzar sudoa utilizar el programa askpass mediante el uso de la opción -A. Por defecto, lo usará solo si no hay un terminal conectado.

rodrigo
fuente
La solución actual requiere una interfaz gráfica de usuario. Qué programa askpass funciona en la terminal.
aquí el
@here: Bueno ... si ejecuta ssh desde una terminal, le pedirá una contraseña directamente, no necesita nada especial ... ¿O está pidiendo solicitar la contraseña desde una terminal diferente a la que lo hará? ejecutar la sesión ssh?
rodrigo
1
ahh ahora veo que -Ano toma argumentos. -Arequiere entorno SUDO_ASKPASSo un sudo.confarchivo. En ese caso, ssh host "export SUDO_ASKPASS=askpass;sudo -A cat /etc/passwd"todavía funcionaría con un askpass basado en terminal, sin embargo, @chandru es mucho más conciso a continuación conssh -t ...
aquí el
Hay algunos cavats con el uso de -A. Primero, si se usa -A y no se ha establecido SUDO_ASKPASS, obtendrá un error. Segundo, cuando se usa -A ssh no usará credenciales almacenadas en caché, siempre solicitará una contraseña.
anthony
Como adendum, puede consultar mis notas sobre los programas de ingreso de contraseña ... ict.griffith.edu.au/anthony/info/crypto/passwd_input.txt
anthony
26

Para usuarios de Ubuntu 16.04

Hay un archivo con el que debes leer:

cat /etc/sudoers.d/README

Colocando un archivo con modo 0440 en /etc/sudoers.d/myuser con el siguiente contenido:

myuser  ALL=(ALL) NOPASSWD: ALL

Debería solucionar el problema.

No olvides:

chmod 0440 /etc/sudoers.d/myuser
Vasili Pascal
fuente
Agradable. Solución más limpia que la popular.
Paul Praet
2
No sigas esto a ciegas. Creé un nuevo archivo en /etc/sudoers.d como se describe aquí y terminé sin poder usar sudo nunca más. Tuve que eliminar el archivo a través del modo de recuperación.
Stian
25

Prueba este:

echo '' | sudo -S my_command
sNICkerssss
fuente
Funciona para mí, pero ¿alguien puede explicar por qué ayuda?
ololobus
@ololobus envía una contraseña vacía al primer mensaje para ingresar la contraseña
Nikita Koksharov
¡Trabajó! Ninguna de las respuestas mejor calificadas me resolvió.
drerD
1
Devuelve siguiente error: [sudo] password for alper: Sorry, try again. [sudo] password for alper: sudo: 1 incorrect password attempt @sNICkerssss
Alper
16

Si por casualidad viniste aquí porque no puedes sudo dentro del Ubuntu que viene con Windows10

  1. Edite el archivo / etc / hosts desde Windows (con el Bloc de notas), se ubicará en:, %localappdata\lxss\rootfs\etcagregue 127.0.0.1 WINDOWS8, esto eliminará el primer error de que no puede encontrar el host.

  2. Para deshacerse del no tty presenterror, siempre hazsudo -S <command>

Gubatron
fuente
2
Gracias por proporcionar una respuesta a las personas que vinieron aquí por una razón no relacionada con la descripción de la pregunta, pero con el título correspondiente. +1
Jayant Bhawal
15

Inicie sesión en su Linux. Fuego siguiendo los comandos. Tenga cuidado, ya que editar sudoer es una propuesta arriesgada.

$ sudo visudo

Una vez que se abra el editor vi, realice los siguientes cambios:

  1. Comentar Defaults requiretty

    # Defaults    requiretty
    
  2. Ve al final del archivo y agrega

    jenkins ALL=(ALL) NOPASSWD: ALL
    
Susil Parida
fuente
12

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

Ankit Gupta
fuente
11

Esto funcionó para mí:

echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

donde su usuario es "myuser"

para una imagen de Docker, eso sería:

RUN echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
Alexander Mills
fuente
9

Asegúrate de que el comando que estás sudousando sea parte de tu PATH.

Si tiene una sudoersentrada de comando único (o múltiple, pero no TODO) , obtendrá elsudo: no tty present and no askpass program specified el comando cuando el comando no forma parte de su ruta (y la ruta completa no está especificada).

Puede solucionarlo agregando el comando a su PATHo invocando con una ruta absoluta, es decir

sudo /usr/sbin/ipset

En vez de

sudo ipset

omribahumi
fuente
1
Esto en realidad está bifurcado para mí. en sudoers %sitd ALL=(lamparna) NOPASSWD: /usr/bin/git_push_to_lamparna.sh, /usr/bin/gity usando sudo -u lamparna git push --mirror ssh://lamparna@REDMINE/home/lamparna/repos/git/jine/lamparna.giten git post-update hook return no tty, pero usando sudo -u lamparna /usr/bin/git push --mirror ssh://lamparna@REDMINE/home/lamparna/repos/git/jine/lamparna.gittrabajo sin contraseña.
Foton
7

El comando sudofalla ya que está intentando solicitar la contraseña de root y no hay pseudo-tty asignado (ya que es 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

Luego, asegúrese de que su usuario pertenezca al admingrupo (o wheel).

Idealmente (más seguro) sería limitar los privilegios de root solo a comandos específicos que se pueden especificar como %admin ALL=(ALL) NOPASSWD:/path/to/program

kenorb
fuente
Lo sé, esa es una forma mucho más segura de hacerlo. Aunque, escribí el siguiente comando en el sudoersarchivo, apache ALL = (ALL) NOPASSWD:/usr/share/apache-tomcat-7.0.61/bin/startup.shpero no me funciona. da el siguiente errorsudo: >>> /etc/sudoers: syntax error near line 120 <<< sudo: parse error in /etc/sudoers near line 120 sudo: no valid sudoers sources found, quitting sudo: unable to initialize policy plugin
muaaz
1
Por cierto, funciona bien apache ALL=(ALL) NOPASSWD: ALLpero es un riesgo de seguridad. :)
muaaz
6

Creo que puedo ayudar a alguien con mi caso.

Primero, cambié la configuración del usuario en /etc/sudoersreferencia a la respuesta anterior. Pero todavía no funcionó.

myuser   ALL=(ALL) NOPASSWD: ALL
%mygroup  ALL=(ALL:ALL) ALL

En mi caso, myuserestaba en el mygroup.

Y no necesitaba grupos. Entonces, borré esa línea.

(No debería eliminar esa línea como yo, solo marcando el comentario).

myuser   ALL=(ALL) NOPASSWD: ALL

¡Funciona!

Kihoon Han
fuente
3

La ejecución de scripts de shell que contienen comandos sudo en ellos desde jenkins podría no ejecutarse como se esperaba. Para solucionar esto, sigue

Pasos sencillos:

  1. En sistemas basados ​​en ubuntu, ejecute "$ sudo visudo"

  2. esto abrirá el archivo / etc / sudoers.

  3. Si su usuario jenkins ya está en ese archivo, modifíquelo para que se vea así:

jenkins ALL = (ALL) NOPASSWD: ALL

  1. guarda el archivo

  2. Relanzar su trabajo de jenkins

  3. no deberías ver ese mensaje de error otra vez :)

Chandra Pal
fuente
3

Pude hacerlo, pero asegúrese de seguir los pasos correctamente. Esto es para cualquiera que reciba errores de importación.

Paso 1 : Verifique si los archivos y las carpetas tienen un problema de permiso de ejecución. Uso de usuarios de Linux:

chmod 777 filename

Paso 2 : Verifique qué usuario tiene permiso para ejecutarlo.

Paso 3 : abra la terminal, escriba este comando.

sudo visudo

agregue estas líneas al código a continuación

www-data ALL=(ALL) NOPASSWD:ALL
nobody ALL=(ALL) NOPASSWD:/ALL

esto es para otorgar permiso para ejecutar el script y permitirle usar todas las bibliotecas. El usuario generalmente es 'nadie' o 'www-data'.

ahora edite su código como

echo shell_exec('sudo -u the_user_of_the_file python your_file_name.py 2>&1');

vaya a la terminal para verificar si el proceso se está ejecutando, escriba esto allí ...

ps aux | grep python

Esto generará todo el proceso que se ejecuta en Python.

Agregar complementos : use el siguiente código para verificar los usuarios en su sistema

cut -d: -f1 /etc/passwd

¡Gracias!

3rdi
fuente
2

Este error también puede surgir cuando intentas ejecutar un comando de terminal (que requiere contraseña de root) desde algún script que no sea 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 lssin 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 a la extensión Expect TCL: ruby_expect gem].

Lakesare
fuente
2

Para la referencia, en caso de que alguien más encuentre el mismo problema, me quedé atrapado durante una buena hora con este error, lo que no debería suceder ya que estaba usando el parámetro NOPASSWD.

Lo que NO sabía es 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 del contenido de mi archivo con mi problema:

bguser ALL = NOPASSWD: \
    command_a arg_a, \
    command_b arg_b \
    command_c arg_c

Cuando bguser intente ejecutar "sudo command_b arg_b" sin ningún tty (bguser se está utilizando para algún demonio), entonces se encontrará con el error "no hay tty presente y ningún programa askpass especificado".

¿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 tiene permitido ejecutar, etc.")

WhiteWinterWolf
fuente
2

Recibí este error porque había limitado a mi usuario a un solo 'systemctl' ejecutable y había configurado mal el archivo visudo.

Esto es lo que tenía:

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 que mi usuario jenkins reinicie los servicios pero no tenga acceso completo a la raíz

dannrob
fuente
1

Nadie dijo qué podría causar este error, en caso de migración de un host a otro, recuerde verificar el nombre de host en el archivo sudoers:

Entonces 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:

sin tty presente y sin programa askpass especificado

Abc Xyz
fuente
1

Otras opciones, no basadas en NOPASSWD:

  • Inicie Netbeans con privilegios de root ((sudo netbeans) o similar) que presumiblemente bifurcará el proceso de construcción con root y, por lo tanto, sudo tendrá éxito automáticamente.
  • Realice las operaciones que necesita para hacer suexec: haga que sean propiedad de root y configure el modo en 4755. (Esto, por supuesto, permitirá que cualquier usuario en la máquina las 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 necesariamente necesita root, a menos que haga un reenvío avanzado de dispositivos.
Jon Watte
fuente
1

Tal vez la pregunta no está clara de por qué ninguna respuesta coincidía, pero tenía 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

agregando 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

Tenía el mismo mensaje de esta pregunta:

sudo: no tty present and no askpass program specified

Entonces, al leer la respuesta de otros, me convertí en un archivo en /etc/sudoer.d/usermy.server.tld con:

user ALL=NOPASSWD: /usr/lib/openssh/sftp-server

y ahora puedo montar el disco sin darle demasiado derecho a mi usuario.

JOduMonT
fuente
0

Aunque esta pregunta es antigua, sigue siendo relevante para mi sistema más o menos actualizado. Después de habilitar el modo de depuración de sudo ( Debug sudo /var/log/sudo_debug all@infoin /etc/sudo.conf), me señalaron / dev: " /dev is world writable". Por lo tanto, es posible que deba verificar los permisos del archivo tty , especialmente los del directorio donde reside el nodo tty / pts.

u_Ltd.
fuente
0

1 abierto / etc / sudoers

tipo sudo vi /etc/sudoers. Esto abrirá su archivo en modo de edición.

2 Agregar / Modificar usuario de Linux

Busque la entrada para el usuario de Linux. Modifique como se muestra a continuación si lo encuentra o agregue una nueva línea.

<USERNAME> ALL=(ALL) NOPASSWD: ALL

3 Guardar y salir del modo de edición

Maulik Kakadiya
fuente
0

Si agrega esta línea a su /etc/sudoers(vía visudo), solucionará este problema sin tener que deshabilitar el ingreso de su contraseña y cuando sudo -Sno funcione un alias para (scripts de llamada sudo):

Defaults visiblepw

Por supuesto, lea el manual usted mismo para comprenderlo, pero creo que, para mi caso de uso, es ejecutarlo en un contenedor LXD a través de lxc exec instance -- /bin/bashsu bastante seguro, ya que no está imprimiendo la contraseña en una red.

salotz
fuente
0

Usando tubería:

echo your_pswd | sudo -S your_cmd

Usando el documento aquí:

sudo -S cmd <<eof
pwd
eof
#remember to put the above two lines without "any" indentations.

Abra una terminal para pedir contraseña (lo que funcione):

gnome-terminal -e "sudo cmd"
xterm -e "sudo cmd"
Himanshu Tanwar
fuente