Назад | Перейти на главную страницу

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

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

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

MyUserName ALL = (ВСЕ) NOPASSWD: ALL

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

Я задал этот вопрос на 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>

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

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

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

  2. Появляется ли "Hello world" в /var/log/syslog?

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

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

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

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

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

Недавно я обнаружил, что у меня такая же проблема. Не было задержки 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 было очень шумно или испортилось. Так что я изменил порядок разрешения, и все снова заработало быстро.

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

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

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

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

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

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

Чехол SELinux

Если та же команда sudo медленный только в демоне и быстро в командной строке, то это вызвано SELinux наиболее вероятно. (SELinux = NSA Security-Enhanced Linux kernel module, включен в 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 "dont-audit" можно включить с помощью semodule -DB и снова отключен semodule -B.
(Я надеюсь, что скоро я напишу модуль политики SELinux для этого случая здесь или метод из этот ответ может быть использован.)

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

Проверьте свой файл / etc / hosts и убедитесь, что у вас есть запись для 127.0.0.1

(источник)

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

/etc/init.d/nscd force-reload

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

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

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

bind_policy soft

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

Системный случай

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

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

Решение

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