Разыскивание голубятни пользовательское использование пропускной способности IMAP

Установка 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

0
задан 1 October 2013 в 21:06
1 ответ

Этот сценарий может работать. Что ж, у меня сработало с использованием предоставленного вами примера вывода.

#!/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])
0
ответ дан 5 December 2019 в 14:50

Теги

Похожие вопросы