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?
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!
Provare:
Usa la riga NOPASSWD
per tutti i comandi, intendo:
jenkins ALL=(ALL) NOPASSWD: ALL
Metti la linea dopo tutte le altre righe nel file sudoers
.
Questo ha funzionato per me (Ubuntu 14.04).
Provare:
ssh -t remotehost "Sudo <cmd>"
Questo rimuoverà gli errori di cui sopra.
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.
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>
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.
Prova questo:
echo '' | Sudo -S my_command
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
Se per caso sei venuto qui perché non puoi entrare in Sudo all'interno di Ubuntu che viene fornito con Windows10
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.
Per eliminare l'errore no tty present
, fai sempre Sudo -S <command>
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:
Commenta Defaults requiretty
# Defaults requiretty
Vai alla fine del file e aggiungi
jenkins ALL=(ALL) NOPASSWD: ALL
Assicurati che il comando Sudo
ing 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
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
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
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
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:
Sui sistemi ubuntu, esegui "$ sudo visudo"
questo aprirà il file/etc/sudoers.
jenkins ALL = (TUTTI) NOPASSWD: TUTTI
salva il file
Riavvia il tuo lavoro jenkins
non dovresti più vedere il messaggio di errore :)
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.")
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!
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].
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
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
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.
Altre opzioni, non basate su NOPASSWD: