it-swarm.it

Come risolvere l'errore 'Sudo: no tty present e no askpass specificato'?

Sto cercando di compilare alcune fonti usando un makefile. Nel makefile vi è un gruppo di comandi che devono essere eseguiti come Sudo

Quando compilo i sorgenti da un terminale tutto va bene e la marca viene messa in pausa la prima volta che viene eseguito un comando Sudo in attesa di password. Una volta che digito la password, fare riprende e completa.

Ma mi piacerebbe essere in grado di compilare le fonti in NetBeans. Così, ho avviato un progetto e ho mostrato netbeans dove trovare i sorgenti, ma quando compilo il progetto dà l'errore:

Sudo: no tty present and no askpass program specified

La prima volta che colpisce un comando Sudo.

Ho cercato il problema su internet e tutte le soluzioni che ho trovato puntano su una cosa: disabilitare la password per questo utente. Poiché l'utente in questione è root. Non voglio farlo.

C'è un'altra soluzione?

315
hebbo

Concedere all'utente di utilizzare quel comando senza richiedere la password dovrebbe risolvere il problema. Per prima cosa apri una console Shell e digita:

Sudo visudo

Quindi modifica il file da aggiungere alla fine:

username ALL = NOPASSWD: /fullpath/to/command, /fullpath/to/othercommand

per esempio

john ALL = NOPASSWD: /sbin/poweroff, /sbin/start, /sbin/stop

consentirà all'utente john a Sudo poweroff, start e stop senza che venga richiesta la password.

Guarda la parte inferiore dello schermo per le sequenze di tasti che devi usare in visudo - questo non è vi tra l'altro - e uscire senza salvare al primo segno di qualsiasi problema. Avviso di salute: corrompere questo file avrà gravi conseguenze, modificare con cura!

197
nicdaniau

Provare:

  1. Usa la riga NOPASSWD per tutti i comandi, intendo:

    jenkins ALL=(ALL) NOPASSWD: ALL
    
  2. Metti la linea dopo tutte le altre righe nel file sudoers.

Questo ha funzionato per me (Ubuntu 14.04).

143
Fatemeh Jabbari

Provare:

ssh -t remotehost "Sudo <cmd>"

Questo rimuoverà gli errori di cui sopra.

132
user262129

Dopo tutte le alternative, ho trovato: 

Sudo -S <cmd>

L'opzione -S (stdin) fa sì che Sudo legga la password dallo standard input al posto del terminale.

Fonte

Il comando sopra richiede ancora la password da inserire. Per rimuovere manualmente la password, in casi come jenkins, questo comando funziona:

echo <password> | Sudo -S <cmd> 
84
Vingt Cent

Sudo di default leggerà la password dal terminale allegato. Il tuo problema è che non è collegato alcun terminale quando viene eseguito dalla console netbeans. Quindi devi usare un modo alternativo per inserire la password: si chiama askpass program.

Il programma askpass non è un programma particolare, ma qualsiasi programma che può richiedere una password. Ad esempio nel mio sistema x11-ssh-askpass funziona bene.

Per fare ciò devi specificare quale programma usare, sia con la variabile d'ambiente Sudo_ASKPASS che nel file Sudo.conf (vedi man Sudo per i dettagli).

È possibile forzare Sudo per utilizzare il programma askpass utilizzando l'opzione -A. Di default lo userà solo se non c'è un terminale collegato.

38
rodrigo

Prova questo:

echo '' | Sudo -S my_command
20
sNICkerssss

Per utenti di Ubuntu 16.04 

C'è un file che devi leggere con: 

cat /etc/sudoers.d/README

Inserimento di un file con la modalità 0440 in /etc/sudoers.d/myuser con il seguente contenuto:

myuser  ALL=(ALL) NOPASSWD: ALL

Dovrebbe risolvere il problema. 

Non dimenticare di: 

chmod 0440 /etc/sudoers.d/myuser
15
Vasili Pascal

Se per caso sei venuto qui perché non puoi entrare in Sudo all'interno di Ubuntu che viene fornito con Windows10

  1. Modifica il file/etc/hosts da Windows (con Blocco note), si troverà a: %localappdata\lxss\rootfs\etc, aggiungi 127.0.0.1 WINDOWS8, questo eliminerà il primo errore che non riesce a trovare l'Host.

  2. Per eliminare l'errore no tty present, fai sempre Sudo -S <command>

15
Gubatron

Accedi al tuo Linux. Fuoco seguendo i comandi. Fai attenzione, poiché modificare sudoer è una proposta rischiosa.

$ Sudo visudo

Una volta che l'editor di vi si apre, apporta le seguenti modifiche:

  1. Commenta Defaults requiretty

    # Defaults    requiretty
    
  2. Vai alla fine del file e aggiungi 

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

Assicurati che il comando Sudoing sia parte di PATH.

Se si dispone di una sola voce (o multi, ma non TUTTI) sudoers, si otterrà Sudo: no tty present and no askpass program specified quando il comando non fa parte del percorso (e il percorso completo non è specificato).

Puoi aggiustarlo aggiungendo il comando al tuo PATH o invocandolo con un percorso assoluto, ad es.

Sudo /usr/sbin/ipset

Invece di

Sudo ipset

8
omribahumi

In Jenkins:

echo '<your-password>' | Sudo -S command

Per esempio:-

echo '******' | Sudo -S service nginx restart

Puoi usare Mask Password Plugin per nascondere la tua password

8
Ankit Gupta

Questo ha funzionato per me:

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

dove il tuo utente è "myuser"

per un'immagine Docker, sarebbe solo:

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

Comando Sudo non riesce mentre sta tentando di richiedere la password di root e non vi è alcuna pseudo-tty allocata (dato che fa parte dello script).

È necessario eseguire il login come root per eseguire questo comando o configurare le seguenti regole in /etc/sudoers (o: Sudo visudo):

# Members of the admin group may gain root privileges.
%admin  ALL=(ALL) NOPASSWD:ALL

Quindi assicurati che il tuo utente appartenga al gruppo admin (o wheel).

Idealmente (più sicuro) sarebbe limitare i privilegi di root solo a specifici comandi che possono essere specificati come %admin ALL=(ALL) NOPASSWD:/path/to/program

5
kenorb

L'esecuzione degli script di Shell che contengono comandi Sudo in essi contenuti da jenkins potrebbe non essere eseguita come previsto. Per risolvere questo problema, segui

Semplici passaggi:

  1. Sui sistemi ubuntu, esegui "$ sudo visudo"

  2. questo aprirà il file/etc/sudoers.

  3. Se il tuo utente jenkins è già in quel file, modifica come segue:

jenkins ALL = (TUTTI) NOPASSWD: TUTTI

  1. salva il file

  2. Riavvia il tuo lavoro jenkins 

  3. non dovresti più vedere il messaggio di errore :)

2
Chandra Pal

Per il riferimento, nel caso in cui qualcun altro incontri lo stesso problema, sono rimasto bloccato durante un'ora buona con questo errore che non dovrebbe accadere dal momento che stavo usando il parametro NOPASSWD.

Quello che NON sapevo era che Sudo potrebbe sollevare lo stesso identico messaggio di errore quando non c'è tty e il comando che l'utente tenta di avviare non fa parte del comando consentito nel file/etc/sudoers.

Ecco un esempio semplificato del mio contenuto di file con il mio problema:

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

Quando bguser proverà a lanciare "Sudo command_b arg_b" senza alcun tty (bguser usato per qualche demone), allora incontrerà l'errore "no tty present e nessun programma askpass specificato".

Perché?

Perché manca una virgola alla fine della riga nel file/etc/sudoers ...

(Mi chiedo anche se si tratti di un comportamento previsto e non di un bug in Sudo poiché il messaggio di errore corretto per questo caso è "Mi dispiace, l'utente bguser non può eseguire ecc.")

1
WhiteWinterWolf

Penso di poter aiutare qualcuno nel mio caso.

Innanzitutto, ho modificato le impostazioni utente in /etc/sudoers facendo riferimento alla risposta di cui sopra. Ma ancora non ha funzionato. 

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

Nel mio caso, myuser era nel mygroup.

E non avevo bisogno di gruppi. Quindi, cancellato quella linea.

(Non dovrebbe cancellare quella linea come me, solo contrassegnando il commento.)

myuser   ALL=(ALL) NOPASSWD: ALL

Funziona!

1
kihoon han

Questo errore può anche sorgere quando si sta tentando di eseguire un comando di terminale (che richiede la password di root) da alcuni script non-Shell, ad esempio Sudo ls (nei backtick) da un programma Ruby. In questo caso, puoi usare l'utility Expect ( http://en.wikipedia.org/wiki/Expect ) o le sue alternative.
Ad esempio, in Ruby per eseguire Sudo ls senza ottenere Sudo: no tty present and no askpass program specified, è possibile eseguire questo:

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

[questo usa una delle alternative a Expect Estensione TCL: Ruby_expect gem].

1
lakesare

Stavo ricevendo questo errore perché avevo limitato il mio utente a un solo eseguibile 'systemctl' e non avevo configurato correttamente il file visudo.

Ecco cosa ho avuto: 

jenkins ALL=NOPASSWD: systemctl

Tuttavia, è necessario includere il percorso completo dell'eseguibile, anche se si trova sul percorso per impostazione predefinita, ad esempio:

jenkins ALL=NOPASSWD: /bin/systemctl

Ciò consente al mio utente jenkins di riavviare i servizi ma non ha accesso completo alla root

1
dannrob

Nessuno ha detto cosa potrebbe causare questo errore, in caso di migrazione da un host a un altro, ricorda di controllare il nome host nel file sudoers:

Quindi questa è la mia/etc/sudoers config

User_Alias      POWERUSER = user_name
Cmnd_Alias SKILL = /root/bin/Sudo_auth_wrapper.sh
POWERUSER hostname=(root:root) NOPASSWD: SKILL

se non corrisponde

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

verrà visualizzato questo errore:

nessun presente tty e nessun programma askpass specificato

0
Abc Xyz

Forse non è chiaro il motivo per cui nessuna risposta è stata corrispondente Ma ho avuto lo stesso messaggio di errore quando stavo cercando di montare sshfs che richiedeva Sudo: il comando è qualcosa del genere:

sshfs -o sftp_server="/usr/bin/Sudo /usr/lib/openssh/sftp-server" [email protected]:/var/www /mnt/sshfs/www

aggiungendo l'opzione -o debug

sshfs -o debug -o sftp_server="/usr/bin/Sudo /usr/lib/openssh/sftp-server" [email protected]:/var/www /mnt/sshfs/www

Ho avuto lo stesso messaggio di questa domanda:

Sudo: no tty present and no askpass program specified

Quindi leggendo la risposta di altri ho iniziato a creare un file in /etc/sudoer.d/user su my.server.tld con:

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

e ora sono in grado di montare l'unità senza dare troppo diritto in più al mio utente.

0
JOduMonT

Altre opzioni, non basate su NOPASSWD:

  • Avvia Netbeans con il privilegio di root ((Sudo netbeans) o simile) che presumibilmente eseguirà il processo di generazione con root e quindi Sudo avrà automaticamente successo.
  • Fai le operazioni che devi fare suexec - rendili di proprietà di root, e imposta la modalità su 4755. (Questo ovviamente permetterà a qualsiasi utente sulla macchina di eseguirle.) In questo modo, non hanno affatto bisogno di Sudo.
  • La creazione di file del disco rigido virtuale con bootsectors non dovrebbe richiedere assolutamente Sudo. I file sono solo file e gli stivali sono solo dati. Anche la macchina virtuale non dovrebbe necessariamente aver bisogno di root, a meno che non si esegua l'inoltro avanzato dei dispositivi.
0
Jon Watte