Каждую неделю я получаю следующее сообщение об ошибке. Похоже, проблема связана с 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 не была успешно удалена при удалении пакета, поэтому я вручную удалил ее.