Соответствующий вывод Popen через Regex в python - PullRequest
0 голосов
/ 01 марта 2019

Я использую Python Popen, чтобы выполнить команду и записать результат в переменную:

av_proc = Popen(
        [
            CLAMSCAN_PATH,
            "--stdout",
            "-d",
            AV_DEFINITION_PATH,
            blob_full_path
        ],
        stderr=STDOUT,
        stdout=PIPE,
        env=av_env
        )
    communicateArray = av_proc.communicate()
    claimav_output = communicateArray[0].decode('utf-8')        
    logging.info("clamAV output {}".format(claimav_output))
    logging.info("clamAV output Type {}".format(type(claimav_output)))

Печатные строки журнала:

[3/1/19 6:38:01 AM] clamAV output LibClamAV Warning: **************************************************
[3/1/19 6:38:01 AM] LibClamAV Warning: ***  The virus database is older than 7 days!  ***
[3/1/19 6:38:01 AM] LibClamAV Warning: ***   Please update it as soon as possible.    ***
[3/1/19 6:38:01 AM] LibClamAV Warning: **************************************************
[3/1/19 6:38:01 AM] /home/admin/Desktop/blob_folder/test2: Worm.Mydoom.I FOUND
[3/1/19 6:49:28 AM] clamAV output Type <class 'str'>

Моя цель - извлечьИмя вируса в этом выводе, которое является 'Worm.Mydoom.I'.

Выход всегда будет в следующем формате:

Filepath: Detection_Name FOUND

Я написал следующий скрипт на Python для извлечения имени обнаружения:

    matchObj = re.match(r'(?<=:\s)\S+(?=\s+FOUND)', claimav_output)
    logging.info("matchObj  Type {}".format(type(matchObj)))
    logging.info(matchObj.group())
    logging.info(matchObj)

К сожалению, это не работает.может кто-то указать мне на ошибку в моем коде.Вот ошибка, которую я вижу в логах:

[3/1/19 6:38:01 AM] clamAV output Type <class 'str'>
[3/1/19 6:38:01 AM] CLAIMAV Parsing claimav output to extract any scan resullt 
[3/1/19 6:38:01 AM] matchObj  Type <class 'NoneType'>
[3/1/19 6:38:01 AM] 'NoneType' object has no attribute 'group'
[3/1/19 6:38:01 AM] Something went wrong

1 Ответ

0 голосов
/ 01 марта 2019

Вы можете использовать осмотры для захвата имени вируса, используя это регулярное выражение,

(?<=:\s)\S+(?=\s+FOUND)

Демо

Проверьте этот код Python,

import re

s = """[3/1/19 6:02:52 AM] clamAV output b'LibClamAV Warning: **************************************************\nLibClamAV Warning: * The virus database is older than 7 days! \nLibClamAV Warning: Please update it as soon as possible. *\nLibClamAV Warning: **************************************************\n/home/admin/Desktop/blob_folder/test2: Worm.Mydoom.I FOUND\n\n----------- SCAN SUMMARY -----------\nKnown viruses: 3832461\nEngine version: 0.100.2\nScanned directories: 0\nScanned files: 1\nInfected files: 1\nData scanned: 0.02 MB\nData read: 0.02 MB (ratio 1.00:1)\nTime: 6.519 sec (0 m 6 s)\n'

    [3/1/19 6:02:52 AM] clamAV output Type class 'bytes'"""

m = re.search(r'(?<=:\s)\S+(?=\s+FOUND)', s)
if(m):
 print(m.group())

Печатает имя вируса,

Worm.Mydoom.I
...