Почему выполнение команды sudo занимает много времени?


83

За последние несколько месяцев я выбирал Linux (Fedora 10, а затем 11) (и мне это очень нравится - это все равно, что снова и снова открывать для себя компьютеры, так много всего нужно изучить).

Я добавил своего пользователя в последнюю строку файла / etc / sudoers, как показано ниже, чтобы при запросе команды sudo меня не спрашивали мой пароль:

MyUserName ALL = (ALL) NOPASSWD: ALL

Теперь каждый раз, когда я выполняю команду, используя sudo, она приостанавливает заметное количество времени перед тем, как фактически выполнить задачу (~ 10 секунд). Почему это может быть и как я могу это исправить? Я использую Sudo версии 1.7.1 на Fedora 11 x86 64.


Технически это считается редактированием скрипта, верно? Разве сценарий не является программой?

6
NOPASSWD: считается угрозой безопасности и побеждает цель использования sudo в первую очередь.

Я могу купить это, но все еще остается вопрос, почему это так долго.

2
Откуда эта машина получает пользователей и аутентификацию? LDAP, возможно с Kerberos возможно?
— wzzrd

Ответы:


123

Я задал этот вопрос на SO, и он был перенесен сюда. Тем не менее, у меня больше нет возможности редактировать вопрос, как если бы он мне принадлежал, или даже принять правильный ответ, но это оказалось истинной причиной, почему и как ее решить:

Найденный здесь пользователь "rohandhruva" там дает правильный ответ:

Это происходит, если вы меняете имя хоста в процессе установки.

Чтобы решить проблему, отредактируйте файл / 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
Совершенно верно. Несколько удивительно, что такие дистрибутивы, как Fedora, не редактируют / etc / hosts, если вы меняете имя хоста во время установки, но неважно. Это открытый исходный код для вас!
— dimo414

Это исправило мое медленное использование sudo, спасибо! Я отредактировал / etc / hostname и просто забыл отредактировать файл / etc / hosts.
— Джо

2
Добавление имени хоста в строку 127.0.0.1 или :: 1 может привести к привязке определенного программного обеспечения, относящегося к серверу, к нужному имени хоста / IP / интерфейсу. Одним из таких примеров является Cloudera Manager, службы hadoop получают неправильное имя хоста и вводят в заблуждение CM, поскольку все они преобразуются в localhost. Я предлагаю прочитать другой ответ ниже для возможного решения. Это может вызвать или не вызвать проблемы на отдельной рабочей станции, к которой не будут подключены другие компьютеры.
— ddcruver

1
Это также может быть /etc/nsswitch.conf (по аналогичным причинам). У меня был установлен «hosts: dns files», и поэтому он долго искал мое имя хоста на DNS-сервере. Я изменил его на "hosts: files dns", и теперь он будет сначала смотреть в / etc / hosts. Спасибо за этот ответ, который привел меня посмотреть в nsswitch.conf!
— Алан Портер

1
Смешно, что это было решением. Почему в мире sudoкоманда должна смотреть на имя хоста, чтобы работать? При чем тут мое имя хоста sudo echo hello? В любом случае, спасибо за ответ
— smac89

24

Убедитесь, что ваш демон syslog работает правильно; это вызвало проблему для меня.

Запустите следующую команду

logger 'Hello world'
  1. Возвращается ли команда в течение разумного периода времени?

  2. «Привет мир» появляется в /var/log/syslog?

Если это не так, демон syslog потерпел крах. Перезапуск должен исправить вашу проблему.


9
Удивительно, но это была проблема для меня. Кто бы мог подумать. Решением для меня было просто перезапустить системный журнал. service rsyslog restart
— MikeKulls

Тоже самое. service rsyslog restartисправил мои медленные команды sudo.
— Педро Кордейру

Удивительно, но это была проблема для меня. До этого весь запрос на сервер так медленно. Я просто хочу знать почему?
— Майкл Ван

10

Является ли один из файлов / каталогов, которые он должен прочитать при подключении к сети, или это как-то вызывает чтение с медленного USB-устройства? Попробуйте strace и посмотрите, где это медленно; если это пройдет слишком быстро, сделайте

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

Каждая строка будет начинаться со времени, прошедшего с момента ввода предыдущего системного вызова.

(Первоначальный sudo, кажется, необходим; я не знаю, насколько это повлияет на результаты.)


Спасибо. Это на жестком диске, но не USB или сетевой диск.

@Cuga: а чему ты научился у Стрейса?

@oligofren: вам нужно сделать sudo strace
— YSTH

8

Я недавно обнаружил, что у меня была такая же проблема. Там не было задержки sudo, а затем внезапно, около 10-20 секунд задержки. Я определил конкретную проблему, используя:

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

Как себя

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

А потом найдите, где висят системные вызовы.

В моем случае я обнаружил, что он зависает при переводе DNS, по-видимому, один из DNSen в моем списке /etc/resolv.confбыл очень занят или испортился. Поэтому я изменил порядок разрешения, и пуф снова сработал быстро.


Лучший ответ (для меня)! Обнаружил, что мой DBus Broker зависал при отключении от сети, и sudo / KDE истекал при подключении к нему. Спасибо!
— PSSGCSim

Спасибо, это помогло мне. Мне также пришлось отменить предыдущее изменение в hostsстроке в моем /etc/nsswitch.conf. Я добавил «resol dns» в качестве префикса к hostsзначению. Когда я удалил этот префикс, sudo снова был быстр.
— Мнибер

5

Я не уверен насчет Fedora, но я использовал другие системы, где sudo проверит, откуда вы вошли, что, если ваш DNS не настроен должным образом, может занять много времени. Это также можно увидеть, когда SSH подключается к машине - требуются целые годы, чтобы получить приглашение.


5

У меня та же проблема, я проверил /var/log/auth.log и syslog на наличие ошибок. Оказывается, что мой сервер LDAP не мог быть достигнут, и это замедлило все.

Я больше не использовал аутентификацию на основе LDAP, поэтому я удалил все ссылки "ldap" из /etc/nsswitch.conf

С тех пор все снова работает как шарм.


Почему вы публикуете явно не связанный ответ (OP не использовал LDAP) на пятилетний вопрос?
— Свен

7
Потому что это может кому-нибудь помочь. Я проверил все вещи, которые были упомянуты здесь, но ничего не помогло. Кто-то еще может сосредоточиться на том, чтобы посмотреть в правильном направлении с моим ответом, проверив, нет ли у него каких-либо проблем с соединением LDAP в качестве основной причины медленной и не отвечающей команды sudo. Это так же актуально, как ответы, связанные с DNS, в том, что что-то скрыто за обложками, что невидимо для пользователя. Я рассматриваю этот сайт как общий источник знаний, а не просто как один тип вопросов / ответов. Речь идет о сборе соответствующих знаний.
— Сакураба

6
Кроме того, кто в голубом аду ты дискредитировать мою помощь. Этот сайт работает, потому что обмен знаниями стимулируется, а не потому, что люди недовольны. Если вам это не нравится, то вы можете игнорировать это.
— Сакураба

5

В некоторых случаях обнаруживается, что имя хоста (которое было настроено в /etc/sysconfig/ network) не существует в /etc/hostsфайле; поэтому при добавлении в вышеупомянутый файл, файл открывается быстро.


3

У меня была похожая проблема, я исправил ее, указав имя хоста (например, mybox) и полный вывод команды hostname (mybox.mydomain.com). Это прояснило это прямо. Ушел от 2 минут, чтобы открыть / etc / hosts для мгновенного доступа.


3

SELinux чехол

Если одна и та же команда sudo медленная только в демоне и быстрая в командной строке, то это, скорее всего, вызвано SELinux . (SELinux = NSA Security-Enhanced модуль ядра Linux, включен в Fedora по умолчанию.)

Типичным случаем является http-сервер и специальный скрипт для управления сервером, ограниченный в sudoers:

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

В этом случае типично, что ничего о SELinux не сообщается в журнале аудита ausearch -m avc -ts today, но сценарий работает быстро, если мы временно отключаем принудительное применение setenforce 0. (и затем включите обратно setenforce 1)

Единственные релевантные сообщения в системном журнале (journalcrl) - это после задержки 25 секунд:

... sudo [...] pam_systemd (sudo: session): не удалось создать сеанс: не получен ответ. Возможные причины: удаленное приложение не отправило ответ, политика безопасности шины сообщений заблокировала ответ, истекло время ожидания ответа или было разорвано сетевое соединение.
... sudo [...]: pam_unix (sudo: session): сеанс открыт для пользователя root с помощью (uid = 0)

Ведение журнала всех сообщений SElinux "не проводить аудит" можно semodule -DBотключить и снова отключить semodule -B.
(Я надеюсь, что я скоро напишу модуль политики SELinux для этого случая здесь или метод из этого ответа может быть использован.)


Спасибо за эту информацию. Из приведенной здесь информации я смог найти соответствующую статью, в которой отмечалась возможность fprintd(аутентификации по отпечатку пальца) виновника. Устранение fprintdи fprintd-pamрешение проблемы для меня.
— KevinO

@KevinO Рад, что это помогло вам найти решение. Однако я знал, что моя проблема очень специфична и что моим вкладом в этот вопрос должен быть только метод диагностики или исключения подозрений в SELinux.
— hynekcer

Я абсолютно дал ему +1! Это была шина сообщений, которая привела к решению. Я пару раз смотрел на sudo slow, но твоя была подсказка, в которой я нуждался.
— KevinO

1

Глядя на sudoersфайл примера, который у меня есть, я считаю, что после NOPASSWD:бита должен быть пробел .


Я добавил пробел, но он все еще имеет отставание. Спасибо за предложение.


1

После устранения проблем с хостом убедитесь, что вы удалили все поврежденные кеши DNS, если у вас запущено приложение кеширования DNS, такое как nscd:

/etc/init.d/nscd force-reload

1

Для меня это был krb5-user / config / locales. Я заметил это, изучив /var/log/auth.log. Использование apt-get remove для удаления исправленных пакетов. Не удаляйте эти пакеты, если вы находитесь на компьютере, требующем Kerberos (pam_krb5).


0

Вы используете LDAP для аутентификации?

Если это так, вы, вероятно, хотите использовать мягкую политику привязки. В /etc/ldap/ldap.conf (или /etc/ldap.conf):

bind_policy soft

0

Похоже, у вас есть какой-то таймаут в цепочке аутентификации. Проверьте, как sudo пытается аутентифицироваться, и следите за узкими местами.


0

Системный чехол

Для меня в моей системе не хватило памяти, и многие процессы потерпели крах. Моя система основана на systemd, и что-то там потерпело крах. Мне сложно вспомнить все, что я делал, но:

  • systemctl status <any.service> будет тайм-аут
  • Я не мог sudo reboot(на системной основе)

Решение

Перезапуск исправил мою проблему, но для меня это было просто бинтом. Вам все еще нужно выяснить, почему у вас закончилась память / произошел сбой.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.