Am încercat să alcătuiască unele surse, folosind un makefile. În makefile există o grămadă de comenzi care trebuie să fi fugit ca "sudo".
Când am compila sursele de la un terminal totul merge bine și este oprit prima dată un "sudo" comanda este fugit de așteptare pentru parola. Odată ce am tip în parola, face reia și completează.
Dar aș dori să fie capabil de a compila sursele în NetBeans. Astfel, am început un proiect și au arătat netbeans în cazul în care pentru a găsi surse, dar când am compila proiectul dă eroare:
sudo: no tty present and no askpass program specified
Prima dată când se lovește de un "sudo" comanda.
Am cautat problema pe internet și toate soluțiile găsite indică un singur lucru: dezactivarea parola pentru acest utilizator. Deoarece utilizatorul în cauză aici este rădăcina. Nu vreau să fac asta.
Există vreo altă soluție?
Acordarea utilizatorul să folosească comanda fara sa ceara parola ar trebui să rezolve problema. În primul rând deschideți o consolă și shell de tip:
sudo visudo
Apoi edita fișiere pentru a adăuga la final:
username ALL = NOPASSWD: /fullpath/to/command, /fullpath/to/othercommand
de exemplu
john ALL = NOPASSWD: /sbin/poweroff, /sbin/start, /sbin/stop
va permite utilizatorului john
sudo oprit
, "start" și "stop", fără a fi determinat de parola.
Uită-te la partea de jos a ecranului pentru tastatura aveți nevoie pentru a utiliza în visudo - acest lucru nu este vi prin modul în care - și ieși fără a salva de la primul semn de orice problemă. Avertisment de sănătate: coruperea acest dosar va avea consecințe grave, edita cu grijă!
Încercați:
jenkins ALL=(ALL) NOPASSWD: ALL
sudoers
de fișier.Care a lucrat pentru mine (Ubuntu 14.04).
După toate alternativele, am găsit:
sudo -S <cmd>
A -S (stdin) opțiunea de cauze sudo pentru a citi parola de la intrarea standard în loc de dispozitiv terminal.
Comanda de mai sus mai are nevoie de parola pentru a fi introduse. Pentru a elimina introducerea parolei manual, în cazuri ca jenkins, această comandă funcționează:
echo <password> | sudo -S <cmd>
"sudo" în mod implicit va citi parola de la atașat terminal. Problema ta este că nu există nici un terminal atașat atunci când este rulat din netbeans consola. Deci, trebuie să utilizați o metodă alternativă pentru a introduce parola: care este numit askpass program.
La askpass program nu este un program special, dar orice program care poate cere o parolă. De exemplu, în sistemul meu x11-ssh-askpass
funcționează bine.
În scopul de a face că aveți pentru a specifica ce program sa folosesc, fie cu variabila de mediu SUDO_ASKPASS
sau în sudo.conf
fișier (a se vedea `man sudo pentru detalii).
Puteți forța "sudo" pentru a utiliza askpass program utilizând opțiunea -A
. În mod implicit se va utiliza numai dacă nu este atașat un terminal.
Pentru Ubuntu 16.04 utilizatori
Există un fișier, trebuie să citiți cu:
cat /etc/sudoers.d/README
Plasarea unui fișier cu modul 0440 în /etc/sudoers.d/myuser cu următorul conținut:
myuser ALL=(ALL) NOPASSWD: ALL
Ar trebui să rezolva problema.
Nu uita sa:
chmod 0440 /etc/sudoers.d/myuser
Daca prin orice sansa ai venit aici pentru că puteți't sudo în Ubuntu, care vine cu Windows10
Editați fișierul /etc/hosts din Windows (cu Notepad), l'll fi situat la: %localappdata\lxss\rootfs\etc
, adaug 127.0.0.1 WINDOWS8
, acest lucru va scăpa de prima eroare care se poate't găsi gazdă.
Pentru a scapa de nu tty prezent
eroare, face mereu sudo -S <command>
Conectare în linux. Focul următoarele comenzi. Fii atent, ca editarea sudoer este o propunere riscantă.
$ sudo visudo
Odată ce vi se deschide editorul de a face următoarele modificări:
Defaults requiretty
jenkins ALL=(ALL) NOPASSWD: ALL
În Jenkins:
echo '<your-password>' | sudo -S command
Exemplu:-
echo '******' | sudo -S service nginx restart
Puteți utiliza Parola Masca Plugin pentru a ascunde parola
Aceasta a lucrat pentru mine:
echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
în cazul în care dvs. de utilizator este "myuser"
pentru un Docher de imagine, care ar fi:
RUN echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
Asigurați-vă că comanda're `sudo 'ing este parte din "CALE".
Dacă aveți un singur (sau mai multe, dar nu TOATE) comanda sudoers intrare, te'll ia
sudo: nu tty prezent și nu askpass program specificat` în cazul în care comanda nu este parte din calea ta (și calea completă nu este specificat).
Puteți să-l repara, fie prin adăugarea de comanda la "CALE" sau o invocă cu o cale absolută, adică
sudo /usr/sbin/ipset
În loc de
sudo ipset
Comanda "sudo" nu ca ea este încercarea de a solicita pe parola de root și nu există nici o pseudo-tty alocate (ca's parte a script-ul).
Ai nevoie să fie conectați-ca root pentru a rula această comandă sau set-up următoarele reguli în /etc/sudoers
(sau: sudo visudo
):
# Members of the admin group may gain root privileges.
%admin ALL=(ALL) NOPASSWD:ALL
Apoi asigurați-vă că dvs. de utilizator aparține "admin" grup (sau "roată").
În mod ideal (mai sigur), ar fi la limita privilegii de root numai pentru anumite comenzi care pot fi specificate ca %admin ALL=(ALL) NOPASSWD:/path/to/program
Cred că pot ajuta pe cineva cu cazul meu.
În primul rând, am schimbat setarea de utilizator în /etc/sudoers
referindu-se la răspunsul de mai sus. Dar încă n't de lucru.
myuser ALL=(ALL) NOPASSWD: ALL
%mygroup ALL=(ALL:ALL) ALL
În cazul meu, myuser
a fost în anii mygroup
.
Și eu am't nevoie de grupuri. Deci, șters acea linie.
(Ar trebui't a șterge linia aia ca mine, doar marcajul de comentariu.)
myuser ALL=(ALL) NOPASSWD: ALL
Acesta funcționează!
Rularea script shell care conțin comenzi sudo în ele de la jenkins ar putea să nu ruleze cum era de așteptat. Pentru a rezolva această problemă, urmați de-a lungul
Pași simpli:
Pe ubuntu bazate pe sisteme, executați " $ sudo visudo "
aceasta va deschide /etc/sudoers fișier.
Dacă jenkins utilizatorul este deja în acel fișier, apoi pe modificați pentru a arata ca acest lucru:
jenkins ALL=(ALL) NOPASSWD: ALL
salvați fișierul
Relansarea jenkins treaba
tu nu vezi că mesajul de eroare din nou :)
Am fost obtinerea această eroare pentru că a avut limitată meu de utilizator la doar un singur executabil 'systemctl' și a greșit la visudo fișier.
Aici's de ce am avut:
jenkins ALL=NOPASSWD: systemctl
Cu toate acestea, trebuie să includă calea completă către fișierul executabil, chiar dacă acesta este pe calea ta implicit, de exemplu:
jenkins ALL=NOPASSWD: /bin/systemctl
Aceasta permite mea jenkins utilizatorului pentru a reporni servicii, dar nu au acces deplin rădăcină
Pentru referință, în cazul în care cineva se confruntă cu aceeași problemă, am fost blocat în timpul de o oră cu această eroare care nu ar trebui să se întâmple, deoarece am fost folosind NOPASSWD parametru.
Ceea ce NU știam era că sudo poate ridica exact același mesaj de eroare atunci când nu există nici tty și comanda utilizatorul încearcă să lanseze nu este parte a permis comandă în /etc/sudoers fișier.
Aici un exemplu simplificat de dosarul meu de conținut cu problema mea:
bguser ALL = NOPASSWD: \
command_a arg_a, \
command_b arg_b \
command_c arg_c
Când bguser va încerca pentru a lansa "sudo command_b arg_b", fără nici tty (bguser fiind folosit pentru unele daemon), atunci el va întâlni eroare "nu tty prezent și nu askpass program specificat".
De ce?
Pentru o virgula lipsește de la capătul de linie în /etc/sudoers fișier...
(Chiar mă întreb dacă acest lucru este un comportament așteptat și nu un bug în sudo deoarece mesajul de eroare corect pentru un astfel de caz ar fi "îmi pare Rău, utilizatorul bguser nu este permis să execute etc.")
Această eroare poate apărea, de asemenea, atunci când sunteți încercarea de a rula un terminal de comandă (care necesită parola de root) de la un non-shell script, de exemplu sudo e
(în backticks) dintr-un Rubin program. În acest caz, puteți folosi Aștepta utility (http://en.wikipedia.org/wiki/Expect) sau alternativele sale.
De exemplu, în Ruby pentru a executa sudo e
fără să `sudo: nu tty prezent și nu askpass program specificat, puteți rula acest lucru:
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
[acesta utilizează una dintre alternativele la Aștepta TCL extensie: ruby_expect gem].
Alte opțiuni, nu se bazează pe NOPASSWD:
Nimeni nu a spus ce ar putea cauza aceasta eroare, în caz de migrare de la o gazdă la alta, amintiți-vă despre verificarea gazdă în sudoers fișier:
Deci, acest lucru este meu /etc/sudoers config
User_Alias POWERUSER = user_name
Cmnd_Alias SKILL = /root/bin/sudo_auth_wrapper.sh
POWERUSER hostname=(root:root) NOPASSWD: SKILL
dacă nu't de meci
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
acesta va apărea această eroare:
nu tty prezent și nu askpass program specificat