Прежде всего: я знаю, что уже были вопросы по этой проблеме, но даже используя их ответы, я все еще не могу понять, почему моя команда не работает.
Я хочу вызвать сценарий на удаленном хосте с помощью NRPE. Однако то, что собирается делать скрипт, может выполнить только конкретный пользователь (назовем его userA
).
Теперь моя команда NRPE выглядит так:
command[debug_now]=/usr/local/bin/debug_now
У моих sudoers есть запись nagios ALL=(tomcat) NOPASSWD: /usr/local/bin/debug_now
как я заметил, пользователь, вызывающий скрипты из nrpe.cfg, называется nagios
.
Сценарий /usr/local/bin/debug_now
выглядит как:
#!/bin/sh
whoami
echo "Debug..."
sudo -u tomcat whoami
echo "Debug finished"
Сценарий, указанный выше, имеет те же права, что и другие сценарии, которые может выполнять пользователь. nagios
. Более того, когда он выполняется локально, он довольно печатает:
nagios
Debug...
tomcat
Debug finished
и обычно он работает так, как задумано. Однако когда он вызывается с хоста управления, он печатает только
nagios
Debug...
Debug finished
Вероятно, это вызвано NRPE: Cannot read output
, который появляется каждый раз, когда я пытаюсь sudo
что-нибудь от хоста управления. Я уже пробовал добавить в запись sudoers Defaults !requiretty
безуспешно. Я использую Debian 6.0.7. Что я могу сделать, чтобы мой скрипт заработал при вызове с хоста управления?
РЕДАКТИРОВАТЬ.
Прежде всего, каталог /etc/sudoers.d/
содержит только файл README.
userA
настоящее имя должно быть tomcat
Давайте посмотрим на visudo
тогда вывод:
Defaults env_reset
Defaults !requiretty
root ALL=(ALL) ALL
nagios ALL=(tomcat) NOPASSWD: /usr/bin/whoami
%www ALL=(ALL) NOPASSWD: /bin/su - www
%tomcat ALL=(ALL) NOPASSWD: /bin/su - tomcat
%tomcat ALL=(ALL) NOPASSWD: /etc/init.d/tomcat stop
%tomcat ALL=(ALL) NOPASSWD: /etc/init.d/tomcat start
%tomcat ALL=(ALL) NOPASSWD: /etc/init.d/tomcat restart
Обратите внимание, я пробовал даже nagios ALL=(tomcat) NOPASSWD: ALL
и nagios ALL=(ALL) NOPASSWD: ALL
. Я также удалил несколько пользовательских записей, например username ALL=(ALL) NOPASSWD: ALL
.
NRPE
$ tail -n 1 /etc/nagios/nrpe.cfg
command[debug_now]=/usr/local/bin/debug_now
$ ls -l /usr/local/bin/debug_now
-rwxr-xr-x 1 root staff 573 Dec 2 09:06 /usr/local/bin/debug_now
$ ls -lh /usr/local | grep bin
drwxrwsr-x 2 root staff 4.0K Dec 2 09:12 bin
$ ls -lh /usr | grep local
drwxrwsr-x 14 root staff 4.0K Oct 22 2010 local
От другого хозяина
$ /usr/lib/nagios/plugins/check_nrpe -H <ip address> -c debug_now
nagios
Debug...
Debug finished
О боже, мне так стыдно прямо сейчас.
Все хорошо. Тебе надо НАЧАТЬ СНАЧАЛА nagios-nrpe-server
после изменения sudoers
, перезагрузки недостаточно. Перезагрузка в порядке, если вы только измените nrpe.cfg
или другой файл конфигурации.
@MadHatter, @Keith - спасибо вам, ребята, за вашу помощь!
Я попытался воспроизвести вашу проблему на компьютере Debian Squeeze (6.0.10), но у меня не было проблем. Если вы настроите именно так (с правильной настройкой sudo, как указывает MadHatter), включая правильные разрешения и режимы, он будет вести себя так, как вы ожидаете.
# ls -l /etc/sudoers.d/nagios-test
-r--r----- 1 root root 44 Dec 1 11:36 /etc/sudoers.d/nagios-test
# cat /etc/sudoers.d/nagios-test
nagios ALL=(keith) NOPASSWD:/usr/bin/whoami
# tail -n 1 /etc/nagios/nrpe.cfg
command[debug]=/usr/local/bin/debug
# ls -l /usr/local/bin/debug
-rwxr-xr-x 1 root staff 75 Dec 1 11:37 /usr/local/bin/debug
# cat /usr/local/bin/debug
#!/bin/sh
whoami
echo "Debug..."
sudo -u keith whoami
echo "Debug finished"
От другого хозяина:
$ ./check_nrpe -H squeeze -c debug
nagios
Debug...
keith
Debug finished
Ваш sudoers
запись указывает привилегии для запуска /usr/local/bin/debug_now
, но ваш сценарий говорит sudo -u userA whoami
. Это не будет работать; любую команду, с которой вы хотите запустить sudo
привилегии, вот что должно появиться в sudoers
файл.