Dlaczego wykonanie polecenia sudo trwa długo?


83

W ciągu ostatnich kilku miesięcy korzystałem z Linuksa (Fedora 10, potem 11) (i cieszę się nim niezmiernie - to tak jakby odkrywać komputery od nowa, tyle rzeczy do nauczenia się).

Dodałem mojego użytkownika do ostatniego wiersza pliku / etc / sudoers, jak pokazano poniżej, aby nie pojawiać się pytanie o hasło podczas wykonywania polecenia sudo:

MyUserName ALL = (ALL) NOPASSWD: ALL

Teraz za każdym razem, gdy wykonuję polecenie za pomocą sudo, wstrzymuje on zauważalną ilość czasu przed faktycznym wykonaniem zadania (~ 10 sekund). Dlaczego tak może być i jak mogę to naprawić? Używam Sudo w wersji 1.7.1 na Fedorze 11 x86 64.


Technicznie liczy się to jako edycja skryptu, prawda? Czy skrypt nie jest programem?

6
NOPASSWD: jest uważane za zagrożenie dla bezpieczeństwa i jest sprzeczne z celem używania sudo w pierwszej kolejności.

Mogę to kupić, ale wciąż pozostaje pytanie, dlaczego to trwa tak długo.

2
Skąd bierze się ten komputer i użytkownicy i uwierzytelnianie? LDAP, być może z Kerberosem?
— wzzrd

Odpowiedzi:


123

Zadałem to pytanie na SO i tutaj zostało przeniesione. To powiedziawszy, nie mam już możliwości edytowania pytania tak, jakbym był jego właścicielem, ani nawet przyjmowania poprawnej odpowiedzi, ale okazało się to prawdziwym powodem, dla którego i jak to rozwiązać:

Znaleziony tutaj Użytkownik „rohandhruva” tam daje prawidłową odpowiedź:

Dzieje się tak, jeśli zmienisz nazwę hosta podczas procesu instalacji.

Aby rozwiązać problem, edytuj plik / etc / hosts

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 <ADD_YOURS_HERE> 
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 <ADD_YOURS_HERE>

3
Całkiem dobrze. Nieco zaskakujące jest to, że dystrybucje takie jak Fedora nie edytują / etc / hosts, jeśli zmienisz swoją nazwę hosta w czasie instalacji, ale cokolwiek. To dla ciebie otwarte oprogramowanie!
— dimo414,

To naprawiło moje wolne używanie sudo, dzięki! Edytowałem / etc / hostname i po prostu zapomniałem edytować plik / etc / hosts.
— Joe

2
Dodanie nazwy hosta do wiersza 127.0.0.1 lub :: 1 może spowodować, że niektóre oprogramowanie związane z serwerem zostanie powiązane z właściwą nazwą hosta / adresem IP / interfejsem. Jednym z takich przykładów jest Cloudera Manager, usługi hadoop uzyskują niewłaściwą nazwę hosta i mylą CM, ponieważ wszystkie one rozwiązują się na localhost. Sugeruję przeczytanie innej odpowiedzi poniżej, aby znaleźć możliwe rozwiązanie. Może to powodować problemy z samodzielną stacją roboczą, która nie będzie się z nią łączyć z innymi komputerami.
— ddcruver

1
Może to być również /etc/nsswitch.conf (z podobnych powodów). Mój był ustawiony na „hosts: pliki dns”, więc szukałem mojej nazwy hosta na serwerze DNS z długim czasem oczekiwania. Zmieniłem go na „hosts: files dns”, więc teraz najpierw przejrzy / etc / hosts. Dzięki za odpowiedź, która sprawiła, że ​​zajrzałem do nsswitch.conf!
— Alan Porter

1
To niedorzeczne, że to było rozwiązanie. Dlaczego na świecie sudopolecenie musi patrzeć na nazwę hosta, aby działać? Z czym ma związek moja nazwa hosta sudo echo hello? W każdym razie dzięki za odpowiedź
— smac89

24

Sprawdź, czy demon syslog działa poprawnie; to spowodowało problem dla mnie.

Uruchom następujące polecenie

logger 'Hello world'
  1. Czy polecenie powraca w rozsądnym czasie?

  2. Czy pojawia się „Hello world” /var/log/syslog?

Jeśli tak nie jest, demon syslog ulega awarii. Ponowne uruchomienie powinno rozwiązać problem.


9
Zaskakująco to był dla mnie problem. Kto by to pomyślał. Rozwiązaniem było dla mnie ponowne uruchomienie syslog. service rsyslog restart
— MikeKulls,

To samo tutaj. service rsyslog restartnaprawiono moje wolne polecenia sudo.
— Pedro Cordeiro,

Zaskakująco to był dla mnie problem. Wcześniej całe żądanie serwera było bardzo wolne. Chcę tylko wiedzieć dlaczego?
— Michael Wang

10

Czy jeden z plików / katalogów musi odczytać na podłączeniu do sieci, czy może w jakiś sposób wyzwala odczyt z wolnego urządzenia USB? Wypróbuj śledzenie i zobacz, gdzie jest wolne; jeśli minie zbyt szybko, zrób to

sudo strace -r -o trace.log sudo echo hi

Każda linia rozpocznie się od czasu, jaki upłynął od wejścia do poprzedniego połączenia systemowego.

(Pierwsze sudo wydaje się konieczne; nie wiem, jak bardzo to zaburzy wyniki).


Dzięki. To jest na dysku twardym, bez USB lub dysku sieciowego.

@Cuga: a czego nauczyłeś się ze strace?

@oligofren: musisz zrobić sudo strace
— 1

8

Niedawno odkryłem, że mam ten sam problem. Nie było opóźnienia sudo, a potem nagle około 10-20 sekund opóźnienia. Określiłem konkretny problem za pomocą:

 1. chmod u+s /usr/sbin/strace  (as the root user)

Jak ty:

 1. sudo -K
 2. strace sudo /bin/tcsh

A następnie dowiedz się, gdzie zawieszają się połączenia systemowe.

W MOIM przypadku okazało się, że wisi on na tłumaczeniu DNS, najwyraźniej jeden z DNSenów na mojej liście /etc/resolv.confbył bardzo mętny lub zepsuł się. Zmieniłem więc kolejność rozdzielczości i poof rzeczy znów działały szybko.


Najlepsza odpowiedź (dla mnie)! Dowiedziałem się, że mój DBus Broker ulega awarii podczas rozłączania sieci, a sudo / KDE przekroczyło limit czasu przy łączeniu się z nim. Dzięki!
— PSSGCSim

Dzięki, pomogło mi to. Musiałem również cofnąć poprzednią zmianę hostswiersza w moim pliku /etc/nsswitch.conf. Dodałem „resolver dns” jako prefiks do hostswartości. Kiedy usunąłem ten prefiks, sudo znów było szybkie.
— mnieber

5

Nie jestem pewien co do Fedory, ale korzystałem z innych systemów, w których sudo sprawdzałoby, skąd jesteś zalogowany, co jeśli nie skonfigurujesz DNS, może upłynąć wiele czasu. Można to również zaobserwować, gdy SSH'ing do maszyny - wymyśla monit.


5

Mam ten sam problem, sprawdziłem /var/log/auth.log i syslog pod kątem błędów. Okazuje się, że mój serwer LDAP nie był dostępny i wszystko spowolniło.

Nie używałem już uwierzytelniania opartego na LDAP, więc usunąłem wszystkie odwołania do „ldap” z /etc/nsswitch.conf

Od tego czasu wszystko znów działa jak urok.


Dlaczego na pięcioletnie pytanie publikujesz oczywiście niezwiązaną odpowiedź (PO nie używał LDAP)?
— Sven

7
Ponieważ może pomóc każdemu. Sprawdziłem wszystkie rzeczy, o których tu wspomniano, ale nic nie pomogło. Ktoś inny może skupić się na spojrzeniu we właściwym kierunku z moją odpowiedzią, sprawdzając, czy ma on jakiekolwiek problemy z połączeniem LDAP jako główną przyczynę powolnego i niereagującego polecenia sudo. Jest tak samo istotny, jak odpowiedzi związane z DNS, ponieważ coś za pokrywami jest winne, co nie jest bezpośrednio widoczne dla użytkownika. Uważam tę stronę za ogólne źródło wiedzy, a nie tylko jako pojedyncze pytanie typu strona internetowa. Chodzi o gromadzenie odpowiedniej wiedzy.
— Sakuraba

6
Także kim, do diabła, jesteście, aby zdyskredytować moją pomoc. Ta strona działa, ponieważ zachęca się do dzielenia się wiedzą, a nie dlatego, że ludzie są lekceważeni. Jeśli ci się nie podoba, masz prawo go zignorować.
— Sakuraba

5

W takim przypadku nazwa hosta (skonfigurowana w /etc/sysconfig/ network) nie istnieje w /etc/hostspliku; więc po dodaniu wyżej wymienionego pliku, plik zostanie natychmiast otwarty.


3

Miałem podobny problem, naprawiłem go, umieszczając zarówno nazwę hosta (np. Mybox), jak i pełny wynik polecenia nazwy hosta (mybox.mydomain.com). To wszystko wyjaśniło. Poszedłem z 2 minut do otwarcia / etc / hosts do natychmiastowego dostępu.


3

Obudowa SELinux

Jeśli to samo polecenie sudo jest powolne tylko w demonie i szybkie w linii poleceń, najprawdopodobniej jest to spowodowane przez SELinux . (SELinux = moduł jądra Linux z ulepszonymi zabezpieczeniami NSA, domyślnie włączony w Fedorze).

Typowym przypadkiem jest serwer http i specjalny skrypt do zarządzania serwerem, ograniczony w sudoers:

apache ALL=(root_or_user) NOPASSWD: /full/path/the_safe_command

W tym przypadku typowe jest to, że w dzienniku kontroli nic nie jest zgłaszane o SELinux ausearch -m avc -ts today, ale skrypt działa szybko, jeśli tymczasowo wyłączymy wymuszanie przez setenforce 0. (a następnie włącz ponownie przez setenforce 1)

Jedynymi istotnymi komunikatami w dzienniku systemowym (Journalcrl) są te z opóźnieniem 25 sekund:

... sudo [...] pam_systemd (sudo: session): Nie można utworzyć sesji: Nie otrzymano odpowiedzi. Możliwe przyczyny to: aplikacja zdalna nie wysłała odpowiedzi, polityka bezpieczeństwa szyny wiadomości zablokowała odpowiedź, upłynął limit czasu odpowiedzi lub połączenie sieciowe zostało zerwane.
... sudo [...]: pam_unix (sudo: session): sesja otwarta dla użytkownika root przez (uid = 0)

Rejestrowanie wszystkich cichych komunikatów SElinux „bez kontroli” można włączyć semodule -DBi wyłączyć ponownie przez semodule -B.
(Mam nadzieję, że wkrótce napiszę tutaj moduł zasad SELinuksa dla tego przypadku lub można użyć metody z tej odpowiedzi ).


Dziękuję za tę informację. Na podstawie tych informacji udało mi się znaleźć pokrewny artykuł, w którym odnotowano możliwość fprintd(uwierzytelnienia odcisków palców) winowajcy. Usunięcie fprintdi fprintd-pamrozwiązanie problemu dla mnie.
— KevinO

@KevinO Zadowolony, że pomógł ci znaleźć rozwiązanie. Wiedziałem jednak, że mój problem był bardzo specyficzny i że mój wkład w to pytanie powinien być jedynie metodą diagnozowania lub wykluczania podejrzeń dotyczących SELinuksa.
— hynekcer

Absolutnie dałem +1! To magistrala komunikatów doprowadziła do rozwiązania. Kilka razy patrzyłem na sudo slow, ale twój był wskazówką, której potrzebowałem.
— KevinO,

1

Patrząc na przykładowy sudoersplik, który mam, sądzę, że po NOPASSWD:bicie powinna być spacja .


Dodałem spację, ale nadal ma opóźnienie. Dziękuję za sugestię.


1

Po naprawieniu problemów z hostem upewnij się, że wyczyściłeś złą pamięć podręczną DNS, jeśli korzystasz z aplikacji buforującej DNS, takiej jak nscd:

/etc/init.d/nscd force-reload

1

Dla mnie instalowano krb5-user / config / locales. Zauważyłem to, sprawdzając /var/log/auth.log. Naprawiono go za pomocą apt-get remove w celu odinstalowania tych pakietów. Nie usuwaj tych pakietów, jeśli oczywiście korzystasz z komputera Kerberos (pam_krb5).


0

Czy używasz LDAP do uwierzytelniania?

Jeśli tak, prawdopodobnie chcesz użyć miękkiej polityki wiązania. W /etc/ldap/ldap.conf (lub /etc/ldap.conf):

bind_policy soft

0

Wygląda na to, że masz jakiś limit czasu w łańcuchu uwierzytelniania. Sprawdź, jak sudo próbuje się uwierzytelnić i wypatruj wąskich gardeł.


0

Sprawa systemowa

Dla mnie w moim systemie zabrakło pamięci i wiele procesów uległo awarii. Mój system opiera się na systemd i coś się tam zawiesiło. Trudno mi zapamiętać wszystko, co zrobiłem, ale:

  • systemctl status <any.service> przekroczyłby limit czasu
  • Nie mogłem sudo reboot(na podstawie systemowej)

Rozwiązanie

Ponowne uruchomienie naprawiło mój problem, ale dla mnie była to tylko bandaid. Nadal musisz dowiedzieć się, dlaczego zabrakło Ci pamięci / uległa awarii.

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.