Jak naprawić błąd „sudo: brak tty i brak określonego programu askpass”?


438

Próbuję skompilować niektóre źródła przy użyciu makefile. W pliku makefile znajduje się kilka poleceń, które należy uruchomić jako sudo.

Kiedy kompiluję źródła z terminala, wszystko idzie dobrze i marka zostaje wstrzymana przy pierwszym uruchomieniu sudopolecenia czekającego na hasło. Po wpisaniu hasła dokonaj wznowienia i uzupełnienia.

Ale chciałbym móc skompilować źródła w NetBeans. Więc zacząłem projekt i pokazałem netbeans gdzie znaleźć źródła, ale kiedy kompiluję projekt, pojawia się błąd:

sudo: no tty present and no askpass program specified

Pierwszy raz uderza sudopolecenie.

Sprawdziłem problem w Internecie i wszystkie znalezione przeze mnie rozwiązania wskazują na jedną rzecz: wyłączenie hasła dla tego użytkownika. Ponieważ użytkownik, o którym mowa, jest rootem. Nie chcę tego robić.

Czy jest jakieś inne rozwiązanie?


3
Kompiluję zabawkowy system operacyjny. Muszę zrobić kilka rzeczy, aby skonfigurować maszynę wirtualną, w tym utworzyć wirtualny dysk twardy z sektorem rozruchowym.
hebbo


Jak wskazano w serverfault.com/a/597268 , sudo -n my-commandpracował dla mnie. HIH!
andreyevbr

1
Proszę wybrać odpowiedź
ichimaru

1
@andreyevbr Nie sądzę. sudo: a password is required
ichimaru

Odpowiedzi:


260

Zezwolenie użytkownikowi na użycie tego polecenia bez pytania o hasło powinno rozwiązać problem. Najpierw otwórz konsolę powłoki i wpisz:

sudo visudo

Następnie edytuj ten plik, aby dodać do samego końca:

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

na przykład

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

pozwoli użytkownikowi johndo sudo poweroff, startastop bez konieczności podawania hasła.

Spójrz u dołu ekranu na naciśnięcia klawiszy, których musisz użyć w visudo - tak przy okazji, to nie vi - i wyjdź bez zapisywania przy pierwszej oznaki jakiegokolwiek problemu. Ostrzeżenie zdrowotne: uszkodzenie tego pliku będzie miało poważne konsekwencje, edytuj ostrożnie!


4
Tak, strona podręcznika sudoers otworzyła mi oczy na sposób, w jaki sudo powinien być używany.
Spencer Williams

6
visudo powinno się otwierać w dowolnym EDYTORZE, w którym skonfigurowane jest środowisko, którym może być (i powinien być ^ _ ^) vi.
Matt Styles

8
Upewnij się, że linia matematyczna NOPASSWD jest PO WSZYSTKICH innych liniach sudo, które mogą być zgodne (np.% Wheel), które nie mają flagi NOPASSWD.
Anthony

27
nie mogę „sudo visudo”, ponieważ nie mogę sudo!
Gubatron

8
Zastanów się nad dodaniem pliku do /etc/sudoers.d i pozostawieniem pliku visudo nietkniętym.
xlttj

183

Próbować:

  1. Użyj NOPASSWDwiersza dla wszystkich poleceń, mam na myśli:

    jenkins ALL=(ALL) NOPASSWD: ALL
    
  2. Umieść linię po wszystkich innych liniach w sudoerspliku.

To działało dla mnie (Ubuntu 14.04).


13
Najpierw dodałem wiersz po innych konfiguracjach użytkownika, ale działał tylko wtedy, gdy został umieszczony jako absolutnie ostatni wiersz w pliku na lubuntu 14.04.1.
user77115

Druga część była rozwiązaniem, którego potrzebowałem. Istniejąca linia konfiguracji (dla grupy kół) również pasowała do mojego polecenia sudo, ale bez wpisu NOPASSWD:. Umieszczenie mojego nowego wiersza po nadaniu mu priorytetu, nie zezwala na użycie hasła do określonej komendy, której potrzebowałem.
Anthony

5
Jak wspomniał @ user77115, działało to tylko wtedy, gdy umieściłeś go jako ostatnią linię w pliku sudoers, nawet w Ubuntu 16.04. Na marginesie, udzielenie sudo uprawnień do jenkins dla wszystkich poleceń jest dość dużym problemem bezpieczeństwa. Rozważ zawinięcie skryptów Jenkinsa i zapewnienie dostępu tylko do określonych poleceń, takich jak: jenkins ALL=(ALL) NOPASSWD: /var/lib/jenkins/wrapper_script
ivandov

jenkinsto tylko nazwa użytkownika? Musi to być nazwa użytkownika z komputera hosta? Co jeśli nazwa użytkownika na hoście odpowiada nazwie użytkownika ze zdalnego serwera?
mrgloom

jest to specyficzne dla Jenkins, wygląda na to, że stackoverflow.com/a/22651598/1041319 jest bardziej ogólnym rozwiązaniem.
arntg

167

Próbować:

ssh -t remotehost "sudo <cmd>"

Spowoduje to usunięcie powyższych błędów.


7
-t Force pseudo-tty allocation. This can be used to execute arbitrary screen-based programs on a remote machinezobacz także: określony sudo-no-tty-present-and-no-askpass-program-określonysudo -A Pozwala także na ustawienie sudoprogramu askpass, ale widzę tylko GUI. Czy ktoś zna askpass, na który pozwala ssh remotehost sudo -A askpass?
tutaj

1
Korekta, -Afor sudonie bierze argumentów i zamiast tego wymaga środowiska SUDO_ASKPASSlub sudo.conf So ssh remotehost sudo -A commandnadal działałby. Wciąż ciekawy terminalowego programu askpass.
tutaj

7
to nie działa dla mnie (przypuszczalnie dlatego, że Pseudo-terminal will not be allocated because stdin is not a terminal.
wywołuję

Działa świetnie dla mnie. Dzięki!
xfra35

1
To nie odpowiada na pytanie.
bschlueter,

125

Po wszystkich alternatywach znalazłem:

sudo -S <cmd>

Opcja -S (stdin) powoduje, że sudo odczytuje hasło ze standardowego wejścia zamiast urządzenia końcowego.

Źródło

Powyższe polecenie nadal wymaga podania hasła. Aby usunąć ręczne wprowadzanie hasła, w przypadkach takich jak Jenkins, to polecenie działa:

echo <password> | sudo -S <cmd> 

To wydaje się naprawiać mój problem. Ale czy przy użyciu tego polecenia występuje jakiś efekt uboczny?
Xiaodong Qi,

3
sudo -S <command>- trueakurat jest fikcyjnym poleceniem, które zwraca kod wyjścia 0 ( falseto polecenie, które zwraca 1). Dziękuję, to jest jedyna prawdziwa odpowiedź, ponieważ wszyscy inni oczekują, że „sudo” zadziała!
Adam Plocher

1
-S: Napisz monit o błędzie standardowym i odczytaj hasło ze standardowego wejścia zamiast korzystać z urządzenia końcowego. Hasło musi poprzedzać znak nowej linii.
fileinster

To działa od razu i może sprawić, że sudo zacznie działać aż do przekroczenia limitu czasu, ale nie rozwiązuje problemów, które mogą istnieć, a problem może wrócić.
nealmcb,

Nie wiem, czy działa, ale pokazuje, że Password:nic się nie dzieje. Nie mogę wpisać hasła.
ichimaru

43

sudodomyślnie odczyta hasło z podłączonego terminala. Problem polega na tym, że terminal nie jest podłączony, gdy jest uruchamiany z konsoli Netbeans. Musisz więc użyć alternatywnego sposobu wprowadzenia hasła: nazywa się to askpass programem .

Program askpass nie jest konkretnym programem, ale dowolnym programem, który może prosić o hasło. Na przykład w moim systemie x11-ssh-askpassdziała dobrze.

W tym celu musisz określić, którego programu użyć, albo ze zmienną środowiskową, SUDO_ASKPASSalbo w sudo.confpliku (zobacz man sudoszczegóły).

Możesz wymusić sudoużycie programu askpass, korzystając z opcji-A . Domyślnie użyje go tylko wtedy, gdy nie ma podłączonego terminala.


Obecne rozwiązanie wymaga GUI. Jaki program askpass działa na terminalu.
tutaj

@tutaj: Cóż ... jeśli uruchomisz ssh z terminala, poprosi on o hasło bezpośrednio, nie potrzebujesz niczego specjalnego ... A może pytasz o podanie hasła z innego terminala niż ten, który będzie uruchomić sesję ssh?
rodrigo

1
Ach, teraz widzę, że -Anie wymaga to argumentów. -Awymaga środowiska SUDO_ASKPASSlub sudo.confpliku. W takim przypadku ssh host "export SUDO_ASKPASS=askpass;sudo -A cat /etc/passwd"nadal działałby z terminalem askpass, jednak @chandru jest o wiele bardziej zwięzły zssh -t ...
tutaj

Istnieje kilka kawatów z użyciem -A. Po pierwsze, jeśli użyto opcji -A i SUDO_ASKPASS nie został ustawiony, pojawi się błąd. Po drugie, gdy użyto opcji -A, ssh nie będzie używać buforowanych danych uwierzytelniających, zawsze zażąda hasła.
Anthony

Jako adendum możesz zajrzeć do moich notatek na temat programów do wprowadzania hasła ... ict.griffith.edu.au/anthony/info/crypto/passwd_input.txt
Anthony

26

Dla użytkowników Ubuntu 16.04

Jest plik, który musisz przeczytać:

cat /etc/sudoers.d/README

Umieszczanie pliku w trybie 0440 w /etc/sudoers.d/myuser z następującą zawartością:

myuser  ALL=(ALL) NOPASSWD: ALL

Powinien rozwiązać problem.

Nie zapomnij:

chmod 0440 /etc/sudoers.d/myuser

Miły. Czystsze rozwiązanie niż popularne.
Paul Praet

2
Nie podążaj za tym na ślepo. Utworzyłem nowy plik w /etc/sudoers.d zgodnie z opisem tutaj i nie mogłem już używać sudo. Musiałem usunąć plik w trybie odzyskiwania.
Stian

25

Spróbuj tego:

echo '' | sudo -S my_command

To działa dla mnie, ale czy ktoś może wyjaśnić, dlaczego to pomaga?
ololobus

@ololobus wysyłasz puste hasło do pierwszego monitu o wprowadzenie hasła
Nikita Koksharov

Pracował! Żadna z wyżej ocenianych odpowiedzi nie rozwiązała mnie.
drerD

1
Zwraca następujący błąd: [sudo] password for alper: Sorry, try again. [sudo] password for alper: sudo: 1 incorrect password attempt @ sNICkerssss
alper

16

Jeśli przypadkiem przyszedłeś tutaj, ponieważ nie możesz sudo w Ubuntu, który jest dostarczany z Windows10

  1. Zmodyfikuj plik / etc / hosts z systemu Windows (za pomocą Notatnika), będzie on znajdować się pod adresem %localappdata\lxss\rootfs\etc:, dodaj 127.0.0.1 WINDOWS8, usunie to pierwszy błąd, że nie może znaleźć hosta.

  2. Aby pozbyć się no tty presentbłędu, zawsze róbsudo -S <command>


2
Dziękujemy za udzielenie odpowiedzi osobom, które przybyły tutaj z powodu niezwiązanego z opisem pytania, ale z pasującym tytułem pytania. +1
Jayant Bhawal


15

Zaloguj się do swojego systemu Linux. Wystrzel następujące polecenia. Zachowaj ostrożność, ponieważ edytowanie sudoer jest ryzykowną propozycją.

$ sudo visudo

Po otwarciu edytora vi dokonaj następujących zmian:

  1. Skomentować Defaults requiretty

    # Defaults    requiretty
    
  2. Idź na koniec pliku i dodaj

    jenkins ALL=(ALL) NOPASSWD: ALL
    


11

To działało dla mnie:

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

gdzie twoim użytkownikiem jest „mój użytkownik”

dla obrazu Docker byłoby to po prostu:

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

9

Upewnij się, że twoje polecenie sudojest częścią twojegoPATH .

Jeśli masz jedno polecenie (lub wiele, ale nie WSZYSTKIE) sudoers, otrzymaszsudo: no tty present and no askpass program specified kiedy polecenie nie jest częścią twojej ścieżki (a pełna ścieżka nie jest określona).

Możesz to naprawić, dodając polecenie do swojego polecenia PATHlub wywołując go ścieżką bezwzględną, tj

sudo /usr/sbin/ipset

Zamiast

sudo ipset


1
To jest dla mnie rozwidlone. w sudoers %sitd ALL=(lamparna) NOPASSWD: /usr/bin/git_push_to_lamparna.sh, /usr/bin/giti używanie sudo -u lamparna git push --mirror ssh://lamparna@REDMINE/home/lamparna/repos/git/jine/lamparna.gitw git po aktualizacji hak powrotu no tty, ale przy użyciu sudo -u lamparna /usr/bin/git push --mirror ssh://lamparna@REDMINE/home/lamparna/repos/git/jine/lamparna.gitpracy bez hasła.
Foton

7

Komenda sudo kończy się niepowodzeniem, ponieważ próbuje monitować o hasło roota i nie ma przydzielonego pseudo-tty (ponieważ jest to część skryptu).

Musisz zalogować się jako root, aby uruchomić to polecenie, lub skonfigurować następujące reguły w swoim /etc/sudoers (lub sudo visudo:):

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

Następnie upewnij się, że użytkownik należy do admingrupy (lub wheel).

Idealnie (bezpieczniej) byłoby ograniczenie uprawnień roota tylko do określonych poleceń, które można określić jako %admin ALL=(ALL) NOPASSWD:/path/to/program


Wiem, to o wiele bezpieczniejszy sposób. Chociaż napisałem następujące polecenie w sudoerspliku, apache ALL = (ALL) NOPASSWD:/usr/share/apache-tomcat-7.0.61/bin/startup.shale to nie działa dla mnie. daje następujący błądsudo: >>> /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
BTW, działa dobrze, apache ALL=(ALL) NOPASSWD: ALLale stanowi zagrożenie bezpieczeństwa. :)
muaaz,

6

Myślę, że mogę pomóc komuś w mojej sprawie.

Najpierw zmieniłem ustawienie użytkownika w /etc/sudoersodniesieniu do powyższej odpowiedzi. Ale nadal nie działało.

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

W moim przypadku myuserbył w mygroup.

I nie potrzebowałem grup. Więc usunąłem ten wiersz.

(Nie należy usuwać tej linii jak ja, tylko zaznaczając komentarz.)

myuser   ALL=(ALL) NOPASSWD: ALL

To działa!


3

Uruchamianie skryptów powłoki zawierających polecenia sudo z jenkins może nie działać zgodnie z oczekiwaniami. Aby to naprawić, wykonaj następujące czynności

Proste kroki:

  1. W systemach opartych na Ubuntu uruchom „$ sudo visudo”

  2. to otworzy plik / etc / sudoers.

  3. Jeśli twój użytkownik jenkins jest już w tym pliku, zmodyfikuj go tak, aby wyglądał następująco:

jenkins ALL = (ALL) NOPASSWD: ALL

  1. Zapisz plik

  2. Uruchom ponownie pracę Jenkinsa

  3. nie powinieneś zobaczyć tego komunikatu o błędzie :)


3

Udało mi się to zrobić, ale upewnij się, że postępujesz zgodnie z instrukcjami. To jest dla każdego, kto dostaje błędy importu.

Krok 1 : Sprawdź, czy pliki i foldery mają problem z wykonaniem uprawnień. Korzystanie z systemu Linux:

chmod 777 filename

Krok 2 : Sprawdź, który użytkownik ma uprawnienia do jego wykonania.

Krok 3 : otwórz terminal i wpisz to polecenie.

sudo visudo

dodaj te linie do kodu poniżej

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

ma to na celu udzielenie pozwolenia na wykonanie skryptu i umożliwienie mu korzystania ze wszystkich bibliotek. Zasadniczo użytkownikiem jest „nikt” lub „dane www”.

teraz edytuj kod jako

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

przejdź do terminala, aby sprawdzić, czy proces jest uruchomiony, wpisz to tutaj ...

ps aux | grep python

spowoduje to wyprowadzenie całego procesu uruchomionego w Pythonie.

Dodaj dodatki : użyj poniższego kodu, aby sprawdzić użytkowników w systemie

cut -d: -f1 /etc/passwd

Dziękuję Ci!


2

Ten błąd może również wystąpić, gdy próbujesz uruchomić komendę terminalową (która wymaga hasła roota) z jakiegoś skryptu nie-powłoki, np. sudo ls(W backticks) z programu Ruby. W takim przypadku możesz użyć narzędzia Expect ( http://en.wikipedia.org/wiki/Expect ) lub jego alternatyw.
Na przykład w Ruby, aby wykonać sudo lsbez uzyskiwania sudo: no tty present and no askpass program specified, możesz uruchomić to:

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

[używa jednej z alternatyw dla rozszerzenia Oczekiwanie TCL: klejnot ruby_expect ].


2

Dla odniesienia, na wypadek, gdyby ktoś napotkał ten sam problem, utknąłem w dobrej godzinie z tym błędem, co nie powinno się zdarzyć, ponieważ użyłem parametru NOPASSWD.

NIE wiedziałem, że sudo może wywołać dokładnie ten sam komunikat o błędzie, gdy nie ma tty, a polecenie, które użytkownik próbuje uruchomić, nie jest częścią dozwolonego polecenia w pliku / etc / sudoers.

Oto uproszczony przykład zawartości mojego pliku z moim problemem:

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

Gdy bguser spróbuje uruchomić „sudo command_b arg_b” bez żadnego tty (bguser jest używany dla jakiegoś demona), wtedy napotka błąd „nie ma tty obecnego i nie określono programu askpass”.

Dlaczego?

Ponieważ na końcu wiersza w pliku / etc / sudoers brakuje przecinka ...

(Zastanawiam się nawet, czy jest to oczekiwane zachowanie, a nie błąd w sudo, ponieważ poprawny komunikat o błędzie dla takiego przypadku powinien brzmieć „Przepraszamy, bguser użytkownika nie może wykonywać itd.”)


2

Otrzymywałem ten błąd, ponieważ ograniczyłem mojego użytkownika do jednego pliku wykonywalnego „systemctl” i źle skonfigurowałem plik visudo.

Oto co miałem:

jenkins ALL=NOPASSWD: systemctl

Musisz jednak podać pełną ścieżkę do pliku wykonywalnego, nawet jeśli domyślnie znajduje się on na Twojej ścieżce, na przykład:

jenkins ALL=NOPASSWD: /bin/systemctl

To pozwala mojemu jenkinsowi na ponowne uruchomienie usług, ale nie ma pełnego dostępu do konta root


1

Nikt nie powiedział, co może powodować ten błąd, w przypadku migracji z jednego hosta na inny pamiętaj o sprawdzeniu nazwy hosta w pliku sudoers:

To jest moja konfiguracja / etc / sudoers

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

jeśli nie pasuje

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

wyświetli się ten błąd:

brak tty i nie określono programu askpass


1

Inne opcje, nie oparte na NOPASSWD:

  • Uruchom Netbeans z uprawnieniami roota ((sudo netbeans) lub podobnymi), które prawdopodobnie rozwidlą proces kompilacji z rootem, a tym samym sudo automatycznie się powiedzie.
  • Wykonaj operacje, które musisz wykonać suexec - ustaw je jako root i ustaw tryb na 4755. (To oczywiście pozwoli każdemu użytkownikowi na komputerze je uruchomić.) W ten sposób nie potrzebują sudo.
  • Tworzenie wirtualnych plików na twardym dysku za pomocą bootsektorów nie powinno wcale wymagać sudo. Pliki to tylko pliki, a sektory rozruchowe to tylko dane. Nawet maszyna wirtualna niekoniecznie potrzebuje roota, chyba że wykonasz zaawansowane przekazywanie urządzeń.

1

Być może pytanie jest niejasne, dlaczego żadna odpowiedź nie pasuje, ale miałem ten sam komunikat o błędzie, gdy próbowałem zamontować sshfs, który wymagał sudo: polecenie jest takie:

sshfs -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" user@my.server.tld:/var/www /mnt/sshfs/www

dodając opcję -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

Miałem tę samą wiadomość na to pytanie:

sudo: no tty present and no askpass program specified

Tak więc, czytając odpowiedzi innych, stałem /etc/sudoer.d/usersię autorem pliku na mój.server.tld z:

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

a teraz jestem w stanie zamontować dysk, nie dając zbyt wiele dodatkowych uprawnień mojemu użytkownikowi.


0

Chociaż to pytanie jest stare, wciąż ma znaczenie dla mojego mniej lub bardziej aktualnego systemu. Po włączeniu trybu debugowania sudo ( Debug sudo /var/log/sudo_debug all@infoin /etc/sudo.conf) wskazałem / dev: " /dev is world writable". Może więc być konieczne sprawdzenie uprawnień do pliku tty , szczególnie tych w katalogu, w którym znajduje się węzeł tty / pts.


0

Jeśli dodasz ten wiersz do /etc/sudoers(przez visudo), rozwiąże to problem bez konieczności wyłączania wprowadzania hasła i gdy alias dla sudo -Snie będzie działał (wywołanie skryptów sudo):

Defaults visiblepw

Oczywiście sam przeczytaj instrukcję, aby ją zrozumieć, ale myślę, że na mój użytek działa w kontenerze LXD za pośrednictwem lxc exec instance -- /bin/bashjego dość bezpiecznego, ponieważ nie drukuje hasła przez sieć.


0

Za pomocą potoku:

echo your_pswd | sudo -S your_cmd

Za pomocą dokumentu tutaj:

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

Otwórz terminal, aby zapytać o hasło (cokolwiek działa):

gnome-terminal -e "sudo cmd"
xterm -e "sudo cmd"

-1

1 otwarte / etc / sudoers

typ sudo vi /etc/sudoers. Spowoduje to otwarcie pliku w trybie edycji.

2 Dodaj / zmień użytkownika linuksa

Poszukaj wpisu dla użytkownika systemu Linux. Zmodyfikuj jak poniżej, jeśli znaleziono lub dodaj nowy wiersz.

<USERNAME> ALL=(ALL) NOPASSWD: ALL

3 Zapisz i wyjdź z trybu edycji

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.