Помимо опции PAM, есть также возможность использования логов. Сейчас я перешел с Fedora на Slackware, поэтому точные файлы могут быть неверными, но если поставить что-то вроде этого:
#!/bin/bash
if [ -f /tmp/erlogin ] ; then
oldvalue=$(cat /tmp/erlogin)
newvalue=$(grep 'invalid password' /var/log/secure|wc -l)
if [ $((newvalue-oldvalue)) -gt 3 ] ; then
shutdown -h now
fi
fi
grep 'invalid password' /var/log/secure|wc -l> /tmp/erlogin
И так каждые 10 минут или около того.
Обратите внимание, что вы можете значительно упростить awk
. Действие по умолчанию, если выражение оценивается как true
, заключается в печати текущей строки. Так что это делает то же самое:
awk -F'|' < filename '$1 == "string"'
В любом случае, вы можете использовать опцию -v
для передачи переменной. Таким образом, ваш сценарий может быть:
#/bin/sh
if [ $# -lt 1 ]; then
echo "At least one argument is required"
exit
fi
## Allow the script to get the filename from the 2nd argument,
## default to 'filename' if no second argument is given
file=${2:-filename}
awk -F'|' -v str="$1" '$1 == str' "$file"