Установка maxlogins предел на самом деле работает здесь. Просто удостоверьтесь, что Вы используете '-' предельный тип, не 'трудно'.
user1 - maxlogins 1
Если Вы хотите ударить пользователей, которые сделали двойной вход в систему с помощью scponly, вот быстрый и грязный сценарий, который делает это. Поместите его в crontab, таким образом, это выполняется каждую минуту.
#!/bin/sh
for user in `grep scponly /etc/passwd | gawk -F: '{print $1}'`; do
echo "Checking user: $user"
instances=`ps -u $user| grep scponly | wc -l`
echo "scponly instances $instances"
if [ $instances -gt 1 ] ; then
echo "Too many connections detected, slaying scponly for user $user"
if [ -e /tmp/$user ] ; then
attempts=`cat /tmp/$user`
echo "Detected $attempts attempts"
# increment attempts counter
echo $(($attempts+1)) > /tmp/$user
if [ $attempts -gt 3 ] ; then
echo "Blocking $user"
/usr/sbin/usermod -L $user
fi
else
echo "1" > /tmp/$user
fi
killall -u $user scponly
fi
done
Сценарий загрузки: http://dl.dropbox.com/u/17194482/kill-scponly.sh
Этот сценарий может работать. Что ж, у меня сработало с использованием предоставленного вами примера вывода.
#!/usr/bin/python
import os
import sys
import re
logline = re.compile(".+?dovecot: IMAP\((.+?)\): Disconnected: Logged out bytes=(\d+)/(\d+)")
matched = 0
totallines = 0
results = {}
if __name__ == "__main__":
if len(sys.argv) < 2:
print "Need logfile to continue"
logfile = open(sys.argv[1])
for line in logfile.readlines():
totallines += 1
log = logline.match(line)
if log:
matched += 1
user, inb, outb = log.group(1), int(log.group(2)), int(log.group(3))
if user in results:
results[user][0] += inb
results[user][1] += outb
else:
results[user] = [inb, outb]
else:
continue
print "Matched {0} of {1} lines".format(matched, totallines)
for k in results.keys():
r = results[k]
print "{0}: {1}/{2} Total: {3}".format(k, r[0], r[1], r[0]+r[1])