Почему выполнение команды 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.