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

Еженедельная ошибка Cron / Logrotate / Denyhosts

Каждую неделю я получаю следующее сообщение об ошибке. Похоже, проблема связана с cron, logrotate или denyhosts. Я не уверен, что именно.

Subject: Cron <root@vps> test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

/etc/cron.daily/logrotate:
test: 91: /etc/hosts.deny: unexpected operator

Какие-либо предложения?

/etc/logrotate.d/denyhosts очень короткий и, как мне кажется, не использует test:

Да, но есть это:

postrotate
/etc/init.d/denyhosts restart > /dev/null
endscript

и этот сценарий делает что-то вроде

    HOSTS_DENY=$(grep ^HOSTS_DENY $CONFIG  | cut -d = -f 2)
    test -e $HOSTS_DENY || touch $HOSTS_DENY

предполагая, что сценарий правильный, если бы мне пришлось угадывать, я бы сказал, что ваша строка HOSTS_DENY в вашем файле конфигурации каким-то образом искажена.

К счастью, нам не нужно гадать, эта команда покажет вам, откуда именно возникла ошибка:

/bin/sh -x /etc/init.d/denyhosts restart

Как насчет /etc/logrotate.d/denyhosts?

Держу пари, что где-то есть sh скрипт с двойным знаком равенства ("==") в test команда вместо одной ("="). Встроенный Баш test позволяет == или =, но оболочка Борна (по крайней мере dash на Ubuntu) позволяет только =. Также мой /usr/bin/test позволяет только один равный. Но посмотрите внизу этого ответа другие примеры, которые вызывают ту же ошибку.

Я бы заглянул в logrotate.conf и посмотрите, есть ли у него строка 91, в которой может быть такая проблема.

Если по какой-то причине вы хотите воссоздать сообщение об ошибке для тестирования:

Создайте файл, назовем его "a", со следующим содержанием:

echo 'In script "a"'
f="/etc/hosts.deny"
test $f == "foo"

А теперь сделайте:

sh a

У вас должно получиться:

In script "a"
test: 3: /etc/hosts.deny: unexpected operator

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

sh -c "test /etc/hosts.deny +"
sh -c "test /etc/hosts.deny -"
sh -c "test /etc/hosts.deny /"
sh -c "test /etc/hosts.deny *"

редактировать: Попробуйте сделать следующее, чтобы сузить область поиска:

$ su -
$ find /etc -type f | xargs awk 'FNR==91 && /test/ {print FILENAME, $0}'

Ты будешь su для получения root-прав, затем запустите find/awk команда. Он покажет вам имена файлов и строку 91 файла, если в этой строке появится слово "test", для каждого файла в /etc. Затем вы можете искать неверные операторы.

Мне кажется, что есть ошибка в строке 91 файла /etc/hosts.deny или /etc/cron.daily/logrotate.

Убедитесь, что записи в hosts.deny правильно отформатированы.

/etd/logrotate.d/denyhosts очень короткий и, как мне кажется, не использует test:

/var/log/denyhosts {
create 0640 root root
missingok
weekly
rotate 7
compress
postrotate
/etc/init.d/denyhosts restart > /dev/null
endscript
}

Единственный экземпляр "test" в строке 91 файла в / etc находится в несвязанном файле.

Задание cron.daily / logrotate указывает на / usr / sbin / logrotate (двоичный файл) - если там есть ошибка, где я могу проверить исходный код?

Для здравомыслия вы можете использовать:

foo:~# which test
/usr/bin/test

чтобы убедиться, что программа тестирования такая, как вы думаете. Один из методов защитного программирования - использовать полный путь к командам в заданиях cron. Это гарантирует, что вызывается правильный двоичный файл, и не позволяет злоумышленнику подставить другую команду с таким же именем ранее в вашем PATH.

Вот несколько советов по устранению неполадок. Я думаю, что Джастин абсолютно на правильном пути. Проблема, вероятно, в вашей настройке denyhosts. Но давайте отследим это.

Вы получаете ошибку изначально из logrotate. Итак, запустите logrotate:

logrotate /etc/logrotate.conf

Предполагая, что вы получили ошибку, по крайней мере, у вас есть воспроизводимый случай. Теперь посмотрим, в чем проблема: в logrotate или denyhosts. Давайте воспользуемся командой denyhosts, которую мы видели в logrotate:

/etc/init.d/denyhosts restart > /dev/null

Если это дает вам ошибку, вы действительно близки к тому, чтобы ее отследить. Попробуйте убрать "> / dev / null" с конца строки, чтобы получить больше информации. Опубликуйте вывод здесь для получения помощи.

Однако, если ни один из двух вышеупомянутых приемов не привел к ошибке, но вы по-прежнему получаете ошибку из заданий cron, у вас проблема. Ждать неделю между попытками что-то отладить - отстой.

Добавьте еще одну строку в свой / etc / crontab. Скопируйте строку cron.weekly и вставьте ее под всеми другими строками. Затем отредактируйте его так, чтобы все записи «когда» были отмечены звездочками.

47  6   *   *   7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )

Измените это на:

*   *   *   *   *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )

Тогда он будет запускаться один раз в минуту в течение всего дня, всю неделю. Это очевидно не что-то, что вы бы хотели оставить там, но это может быть полезно при устранении неполадок.

В тех случаях, когда вы видите ошибки в заданиях cron, которых не видите при запуске скриптов из командной строки, это почти всегда разница в вашей среде. Сначала проверьте путь.

У меня была такая же проблема после удаления пакета denyhosts. Подтвердите, что у вас действительно установлен пакет:

mlambie@prime:~$ dpkg -l | grep denyhosts
rc  denyhosts                              2.6-6.1ubuntu1                    a utility to help sys admins thwart SSH crac

Если пакет установлен, в качестве первых двух символов будет указано «ii». Например, у меня установлен openssh-server и я получаю такой результат:

mlambie@prime:~$ dpkg -l | grep openssh-server
ii  openssh-server                         1:5.3p1-3ubuntu7                  secure shell (SSH) server, for secure access

В моем случае я думаю, что конфигурация logrotate не была успешно удалена при удалении пакета, поэтому я вручную удалил ее.