Come risolvere l'errore "sudo: nessun tty presente e nessun programma askpass specificato"?


438

Sto cercando di compilare alcune fonti usando un makefile. Nel makefile c'è un gruppo di comandi che devono essere eseguiti come sudo.

Quando compilo i sorgenti da un terminale tutto va bene e il make viene messo in pausa la prima volta che sudoviene eseguito un comando in attesa di password. Dopo aver digitato la password, ripristina e completa.

Ma vorrei essere in grado di compilare le fonti in NetBeans. Quindi, ho avviato un progetto e mostrato a netbeans dove trovare le fonti, ma quando compilo il progetto dà l'errore:

sudo: no tty present and no askpass program specified

La prima volta che colpisce un sudocomando.

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

c'è un'altra soluzione?


3
Sto compilando un sistema operativo giocattolo. Devo fare alcune cose per configurare la VM, inclusa la creazione di un hdd virtuale con il settore di avvio.
Hebbo


Come indicato in serverfault.com/a/597268 , ha sudo -n my-commandfunzionato per me. HIH!
andreyevbr,

1
Scegli una risposta
ichimaru,

1
@andreyevbr non la penso così. sudo: a password is required
ichimaru,

Risposte:


260

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 quel file per aggiungerlo fino alla fine:

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

per esempio

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

permetterà all'utente johndi sudo poweroff, starte stopsenza che venga richiesto per la password.

Guarda nella parte inferiore dello schermo per i tasti che devi usare in visudo - questo non è tra l'altro - ed esci senza salvare al primo segno di qualsiasi problema. Avviso sanitario: la corruzione di questo file avrà gravi conseguenze, modificala con cura!


4
Sì, la pagina man sudoers mi ha aperto gli occhi sul modo in cui sudo dovrebbe effettivamente essere usato.
Spencer Williams,

6
visudo dovrebbe aprirsi in qualunque EDITOR il tuo ambiente è configurato per l'uso, che potrebbe benissimo essere (e dovrebbe essere ^ _ ^) vi.
Matt Styles,

8
Assicurati che la linea matematica NOPASSWD sia DOPO qualsiasi altra linea sudo che possa corrispondere (come% wheel) che non ha il flag NOPASSWD.
Anthony

27
non posso "sudo visudo" perché non posso sudo in primo luogo!
Gubatron,

8
Prendi in considerazione l'aggiunta di un file in /etc/sudoers.d e di lasciare intatto il file visudo.
xlttj

183

Provare:

  1. Usa la NOPASSWDlinea per tutti i comandi, intendo:

    jenkins ALL=(ALL) NOPASSWD: ALL
    
  2. Inserisci la riga dopo tutte le altre righe nel sudoersfile.

Ha funzionato per me (Ubuntu 14.04).


13
Ho prima aggiunto la riga dopo altre configurazioni utente, ma ha funzionato solo quando è stata posizionata come ultima riga del file su lubuntu 14.04.1.
user77115,

La seconda parte era la soluzione di cui avevo bisogno. Una riga di configurazione esistente (per il gruppo di ruote) corrispondeva anche al mio comando sudo ma senza la voce NOPASSWD:. Posizionare la mia nuova riga dopo averle assegnato la priorità, non consentendo l'uso della password per il comando specifico di cui avevo bisogno.
Anthony

5
Come menzionato da @ user77115, questo ha funzionato solo se lo hai inserito come ultima riga nel file sudoers, anche con Ubuntu 16.04. Come nota a margine, dare permessi sudo a jenkins per tutti i comandi è un problema di sicurezza piuttosto grande. Prendi in considerazione la possibilità di racchiudere i tuoi script jenkins e dare accesso solo a comandi specifici come: jenkins ALL=(ALL) NOPASSWD: /var/lib/jenkins/wrapper_script
ivandov

jenkinsè solo un nome utente? Deve essere il nome utente dell'utente dalla macchina host? Cosa succede se il nome utente sulla macchina host corrisponde al nome utente dal server remoto?
mrgloom,

questo è specifico per jenkins, sembra che stackoverflow.com/a/22651598/1041319 sia una soluzione più generica.
arntg

167

Provare:

ssh -t remotehost "sudo <cmd>"

Questo rimuoverà gli errori sopra.


7
-t Force pseudo-tty allocation. This can be used to execute arbitrary screen-based programs on a remote machinevedi anche: sudo-no-tty-present-and-no-askpass-program-specificatosudo -A Permette anche di impostare un sudoprogramma askpass, ma vedo solo le GUI. Qualcuno conosce un askpass per consentire ssh remotehost sudo -A askpass?
qui

1
Correzione, Il -Afor sudonon accetta argomenti e invece richiede ambiente SUDO_ASKPASSo un sudo.conf So ssh remotehost sudo -A commandfunzionerebbe comunque. Ancora curioso di sapere un programma askpass basato su terminali.
qui

7
questo non funziona per me (presumibilmente perché sto chiamando ssh da uno script), dandomi l'errore Pseudo-terminal will not be allocated because stdin is not a terminal.:(
knocte

Funziona benissimo per me. Grazie!
xfra35,

1
Questo non risponde alla domanda.
bschlueter,

126

Dopo tutte le alternative, ho trovato:

sudo -S <cmd>

L'opzione -S (stdin) fa sì che sudo legga la password dall'input standard anziché dal dispositivo terminale.

fonte

Il comando sopra deve ancora inserire la password. Per rimuovere l'immissione manuale della password, in casi come jenkins, questo comando funziona:

echo <password> | sudo -S <cmd> 

Questo sembra risolvere il mio problema. Ma c'è qualche effetto collaterale usando questo comando?
Xiaodong Qi,

3
sudo -S <command>- è truesolo un comando fittizio che restituisce un codice di uscita pari a 0 ( falseè un comando che restituisce 1). Grazie, questa è l'unica vera risposta, poiché tutti gli altri si aspettano che "sudo" funzioni!
Adam Plocher,

1
-S: scrivere il messaggio di errore standard e leggere la password dall'input standard invece di utilizzare il dispositivo terminale. La password deve essere seguita da un carattere di nuova riga.
fileinster

Funziona immediatamente e potrebbe far funzionare sudo fino a un timeout, ma non risolve i problemi sottostanti che potrebbero esistere e il problema può ripresentarsi.
nealmcb,

Non so se funziona, ma mostra che Password:non succede nulla. Non riesco a digitare la password.
ichimaru,

43

sudoper impostazione predefinita leggerà la password dal terminale collegato. Il problema è che non è collegato alcun terminale quando viene eseguito dalla console di netbeans. Quindi devi usare un modo alternativo per inserire la password: si chiama il programma askpass .

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

Per fare ciò devi specificare quale programma usare, con la variabile d'ambiente SUDO_ASKPASSo nel sudo.conffile (vedi man sudoper i dettagli).

Puoi forzare sudol'uso del programma askpass usando l'opzione -A. Di default lo userà solo se non è presente un terminale collegato.


La soluzione attuale richiede una GUI. Cosa funziona il programma askpass sul terminale.
qui,

@qui: Beh ... se esegui ssh da un terminale, ti verrà richiesta una password direttamente, non hai bisogno di nulla di speciale ... O stai chiedendo di richiedere la password da un terminale diverso da quello che eseguire la sessione ssh?
rodrigo,

1
ahh ora vedo che -Anon accetta argomenti. -Arichiede un ambiente SUDO_ASKPASSo un sudo.conffile. In tal caso, ssh host "export SUDO_ASKPASS=askpass;sudo -A cat /etc/passwd"funzionerebbe ancora con un askpass basato su terminale, tuttavia @chandru è molto più conciso di seguito conssh -t ...
qui il

Ci sono alcune cavat con l'utilizzo di -A. Innanzitutto, se viene utilizzato -A e SUDO_ASKPASS non è stato impostato, verrà visualizzato un errore. In secondo luogo, quando si utilizza -A ssh non utilizzerà le credenziali memorizzate nella cache, richiederà sempre una password.
Anthony

Come adendum potresti voler leggere le mie note sui programmi di immissione della password ... ict.griffith.edu.au/anthony/info/crypto/passwd_input.txt
anthony

26

Per utenti 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

Bello. Soluzione più pulita di quella popolare.
Paul Praet,

2
Non seguire questo alla cieca. Ho creato un nuovo file in /etc/sudoers.d come descritto qui e alla fine non sono più riuscito a usare sudo .. ho dovuto cancellare il file attraverso la modalità di recupero.
Stian,

25

Prova questo:

echo '' | sudo -S my_command

Funziona per me, ma qualcuno può spiegare perché aiuta?
ololobus,

@ololobus hai inviato una password vuota al primo prompt per inserire la password
Nikita Koksharov,

Lavorato! Nessuna delle risposte più votate l'ha risolta per me.
DrDD

1
Esso restituisce errore seguente: [sudo] password for alper: Sorry, try again. [sudo] password for alper: sudo: 1 incorrect password attempt @sNICkerssss
Alper

16

Se per caso sei venuto qui perché non puoi sudo all'interno di Ubuntu fornito con Windows10

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

  2. Per eliminare l' no tty presenterrore, fare sempresudo -S <command>


2
Grazie per aver fornito una risposta per le persone che sono venute qui per un motivo non correlato alla descrizione della domanda, ma che corrispondono al titolo della domanda. +1
Jayant Bhawal,


15

Accedi al tuo linux. Spara seguendo i comandi. Fai attenzione, poiché la modifica di sudoer è una proposta rischiosa.

$ sudo visudo

Una volta aperto l'editor vi, apportare le seguenti modifiche:

  1. Commentare Defaults requiretty

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

    jenkins ALL=(ALL) NOPASSWD: ALL
    

12

In Jenkins :

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

Ad esempio : -

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

È possibile utilizzare il plug- in Maschera password per nascondere la password


11

Questo ha funzionato per me:

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

dove l'utente è "mioutente"

per un'immagine Docker, sarebbe solo:

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

9

Assicurati che il comando che stai sudoeseguendo sia parte del tuo PATH.

Se hai una sudoersvoce di comando singola (o multipla, ma non TUTTA) , otterrai sudo: no tty present and no askpass program specifiedil comando quando il comando non fa parte del tuo percorso (e il percorso completo non è specificato).

Puoi risolverlo aggiungendo il comando al tuo PATHo invocandolo con un percorso assoluto, ad es

sudo /usr/sbin/ipset

Invece di

sudo ipset


1
Questo è in realtà biforcuto per me. in sudoers %sitd ALL=(lamparna) NOPASSWD: /usr/bin/git_push_to_lamparna.sh, /usr/bin/gite usando sudo -u lamparna git push --mirror ssh://lamparna@REDMINE/home/lamparna/repos/git/jine/lamparna.gitin git ritorno post-aggiornamento hook no tty, ma usandosudo -u lamparna /usr/bin/git push --mirror ssh://lamparna@REDMINE/home/lamparna/repos/git/jine/lamparna.git lavoro senza password.
Foton,

7

Il comando ha sudoesito negativo poiché sta tentando di richiedere la password di root e non è stata allocata alcuna pseudo-tty (poiché fa parte dello script).

È necessario accedere come root per eseguire questo comando o impostare le seguenti regole nel proprio /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 admingruppo (o wheel).

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


Lo so, è un modo molto più sicuro di farlo. Anche se, ho scritto il seguente comando nel sudoersfile apache ALL = (ALL) NOPASSWD:/usr/share/apache-tomcat-7.0.61/bin/startup.shma non funziona per me. dà il seguente erroresudo: >>> /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
A proposito, funziona bene apache ALL=(ALL) NOPASSWD: ALLma un rischio per la sicurezza. :)
muaaz,

6

Penso di poter aiutare qualcuno con il mio caso.

Innanzitutto, ho modificato le impostazioni dell'utente /etc/sudoersfacendo riferimento alla risposta sopra. Ma non ha ancora funzionato.

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

Nel mio caso, myuserera nel mygroup.

E non avevo bisogno di gruppi. Quindi, ho eliminato quella riga.

(Non dovrei cancellare quella riga come me, solo segnando il commento.)

myuser   ALL=(ALL) NOPASSWD: ALL

Funziona!


3

L'esecuzione di script di shell che contengono comandi sudo da jenkins potrebbe non funzionare come previsto. Per risolvere questo problema, segui

Semplici passi:

  1. Sui sistemi basati su Ubuntu, esegui "$ sudo visudo"

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

  3. Se il tuo utente jenkins si trova già nel file, modifica in questo modo:

jenkins ALL = (ALL) NOPASSWD: ALL

  1. salva il file

  2. Riavvia il tuo lavoro jenkins

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


3

Sono stato in grado di farlo, ma assicurati di seguire correttamente i passaggi. Questo è per chiunque riceva errori di importazione.

Passaggio 1 : verificare se i file e le cartelle presentano problemi di autorizzazione di esecuzione. Uso dell'utente Linux:

chmod 777 filename

Passaggio 2 : verificare quale utente dispone dell'autorizzazione per eseguirlo.

Step3 : apri il terminale digita questo comando.

sudo visudo

aggiungi queste righe al codice qui sotto

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

questo per concedere l'autorizzazione per eseguire lo script e consentirgli di utilizzare tutte le librerie. Generalmente l'utente è "none" o "www-data".

ora modifica il tuo codice come

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

vai al terminale per verificare se il processo è in esecuzione, digita qui ...

ps aux | grep python

questo produrrà tutto il processo in esecuzione in Python.

Componenti aggiuntivi : utilizzare il codice seguente per verificare gli utenti nel proprio sistema

cut -d: -f1 /etc/passwd

Grazie!


2

Questo errore può verificarsi anche quando si tenta di eseguire un comando 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, è possibile utilizzare l' utility Expect ( http://en.wikipedia.org/wiki/Expect ) o le sue alternative.
Ad esempio, in Ruby per eseguire sudo lssenza 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

[questa utilizza una delle alternative all'estensione Expect TCL: ruby_expect gem].


2

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 poiché stavo usando il parametro NOPASSWD.

Quello che NON sapevo era che sudo potrebbe generare esattamente lo stesso 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à ad avviare "sudo command_b arg_b" senza alcun tty (bguser utilizzato per alcuni demoni), riscontrerà l'errore "nessun tty presente e nessun programma askpass specificato".

Perché?

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

(Mi chiedo anche se questo è un comportamento previsto e non un bug in sudo poiché il messaggio di errore corretto per tale caso dovrebbe essere "Mi dispiace, l'utente bguser non è autorizzato a eseguire ecc.")


2

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

Ecco cosa ho avuto:

jenkins ALL=NOPASSWD: systemctl

Tuttavia, è necessario includere il percorso completo dell'eseguibile, anche se è 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 root completo


1

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 configurazione / etc / sudoers

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

si aprirà questo errore:

nessun programma presente e nessun programma askpass specificato


1

Altre opzioni, non basate su NOPASSWD:

  • Avvia Netbeans con il privilegio di root ((sudo netbeans) o simile) che presumibilmente biforcerà il processo di compilazione con root e quindi sudo avrà automaticamente successo.
  • Esegui le operazioni necessarie per eseguire suexec: rendile di proprietà di root e imposta la modalità su 4755. (Questo ovviamente consentirà a qualsiasi utente sulla macchina di eseguirle.) In questo modo, non hanno bisogno di sudo.
  • La creazione di file di dischi rigidi virtuali con bootector non dovrebbe richiedere affatto sudo. I file sono solo file e gli stivali sono solo dati. Anche la macchina virtuale non dovrebbe necessariamente necessitare di root, a meno che non si faccia un avanzato forwarding del dispositivo.

1

Forse la domanda non è chiara sul perché nessuna risposta corrispondesse 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" user@my.server.tld:/var/www /mnt/sshfs/www

aggiungendo l'opzione -o debug

sshfs -o debug -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" user@my.server.tld:/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, sono diventato un file /etc/sudoer.d/usersu 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 extra al mio utente.


0

Sebbene questa domanda sia vecchia, è ancora rilevante per il mio sistema più o meno aggiornato. Dopo aver abilitato la modalità debug di sudo ( Debug sudo /var/log/sudo_debug all@infoin /etc/sudo.conf) sono stato indicato / dev: " /dev is world writable". Quindi potrebbe essere necessario controllare le autorizzazioni del file tty , in particolare quelle della directory in cui risiede il nodo tty / pts.


0

1 aperto / etc / sudoers

genere sudo vi /etc/sudoers . Questo aprirà il tuo file in modalità modifica.

2 Aggiungi / Modifica utente linux

Cerca la voce per l'utente Linux. Modificare come di seguito se trovato o aggiungere una nuova riga.

<USERNAME> ALL=(ALL) NOPASSWD: ALL

3 Salva ed esci dalla modalità modifica


0

Se aggiungi questa linea al tuo /etc/sudoers(via visudo) risolverà questo problema senza dover disabilitare l'inserimento della password e quando un alias per sudo -Snon funzionerà (script che chiamano sudo):

Defaults visiblepw

Ovviamente leggi tu stesso il manuale per capirlo, ma penso che per il mio caso d'uso di correre in un contenitore LXD tramite il lxc exec instance -- /bin/bashsuo abbastanza sicuro poiché non stampa la password su una rete.


0

Utilizzando la pipeline:

echo your_pswd | sudo -S your_cmd

Utilizzando qui-documento:

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

Apri un terminale per chiedere la password (a seconda di quale funziona):

gnome-terminal -e "sudo cmd"
xterm -e "sudo cmd"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.