2010-03-20 2 views
1

Мне было предложено написать программу с использованием python для назначения.Python - получение информации из файла syslog

Я был дан в системном журнале файл, и я должен найти вещи об этом

Как я могу узнать, сколько были сделаны попытки войти в корневой учетной записи?

Любой совет будет высоко оценен, поскольку я очень новичок в python и полностью потерян!

+0

не только дублирует вопрос, но дубликат счета? Этот [маленький поросенок] [1] написал вопрос, и этот [маленький поросенок] [2] написал тот же вопрос, и оба этих свиньи названы Джонни ... [1]: http://stackoverflow.com/users/298077/johnny [2]: http://stackoverflow.com/users/298037/johnny – Kiril

ответ

0

что-то вроде этого

#open the file , can be /var/log/messages, /var/log/maillog etc as defined in your system 
f=open("mysyslogfile") 
count=0 
#go through the file 
for line in f: 
    if "<unique pattern for checking root account login>" in line: 
     count+=1 
#close the file 
f.close() 
print "total count: " ,count 
+0

Не рассчитывайте, что 'close' будет вызван вручную. * Всегда * используйте контекстный менеджер ('с открытым (« mysyslogfile ») как f:'), когда это возможно. –

+0

да, сделать это если возможно. но мое решение работает в более старой версии Python без поддержки «с». :) – ghostdog74

+0

@ghostdog, Нет, ваше решение подвержено ошибкам. В pre-2.5 Python вы должны всегда звонить в блок finally. –

0

Возможно, вам необходимо прочитать файл, разбор каждой строки. Когда вы найдете строку, которая соответствует интересующей вас (например, неудачный вход в систему root), вы увеличиваете счетчик.

Посмотрите на how to read files и, возможно, how to use regular expressions.

Если вы собираетесь сделать эту проверку против «живого» файла журнала, скажите каждые пять минут, вам нужно отслеживать, сколько из файла, который вы уже обработали, чтобы вы не читали его каждый раз , Это немного сложнее, потому что вам нужно запомнить состояние (размер файла) между выполнением. В этом случае посмотрите на модуль shelve.

1

Вы хотите /var/log/auth.log, а не syslog.

Он будет содержать такие строки, как это:

Mar 20 10:47:24 Opus su[15918]: pam_unix(su:auth): authentication failure; logname=lfaraone uid=1000 euid=0 tty=/dev/pts/25 ruser=lfaraone rhost= user=root 

Basic, наивный код для выполнения задачи будет следующим:

loginattempts = {"root": 0, 
       "someuser": 0,} # Usernames you want to check 
with open('/var/log/auth.log', 'r') as authlog: 
    for line in authlog: 
     if "authentication failure" in line: 
      username = line.split('=')[-1] # split the string into an array, 
              # using '=' as the delimiter 
      if username in loginattempts: # is the username one we care about? 
       loginattempts[username] += 1 

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

+1

О бит '/ var/log/auth.log', который сильно зависит от системы; Например, на Solaris такого файла нет. Синтаксис также может варьироваться от ОС к ОС. –

Смежные вопросы