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.