Тема: BASH: Для пострадавших от ложного срабатывания clamav
Из-за недоделанных корпоративных антивирусов приходится делать выборочную проверку clamav. Последнее время clamav ошибается принимая вполне кашерные файлы за вирус, строго говоря многие системные библиотеки оказываются по его мнению заражены. Clamav "зараженные" файлы благополучно изымает с хоста, после чего винда естественно работать отказывается. Так вот пришлось сделать скрипт, который вертает на место:
#!/bin/sh
echo
echo "Это та директория, где лежат файлы, которые надо восстановить, и _clamav.log? (Да - y / Нет - n или Ctrl-C)"
read Y
if [ $Y = y -o $Y = Y ];then if [ -f ./_clamav.log ];then
h1=`pwd | sed 's/\/home\/incoming\/infected\///' | awk -F"-" '{print $1}'`
echo -n "пострадавший хост ["$h1"]:"
read h;if [ "H${h}"=="H" ];then h=${h1};fi
# кто я есть?
s=`ps ax | egrep "^ *$PPID" | awk '{print $2}'`
u1=`w | grep "${s}" | awk '{print $3}' | awk -F"." '{print $1"ad"}'`
echo -n "от кого будем восстанавливать ["${u1}"]:"
read u;if [ "H${u}"=="H" ];then u=${u1};fi
# формируем короткий перечень восстанавливаемых файлов
cat _clamav.log | grep "moved to" | iconv -fcp1251 -tutf8 | dos2unix | \
sed 's/^C:/c:/'| sed 's/^D:/d:/'| sed 's/^E:/e:/'| sed 's/^F:/f:/'| sed 's/^G:/g:/'| sed 's/^H:/h:/'> _clamav.log.minutf
# полагаем, что перечень локальных дисков ограничен перечнем c,d,e,f,g,h и для каждого упомянутого
for d in c d e f g h;do
if `egrep -q "^${d}:" _clamav.log.minutf`;then
# проверяем, что в текущей директории вообще нет примонтированных дисков, чтоб не смонтировать повторно
cat /proc/mounts | egrep -q "`pwd | awk '{print $1}'`" || \
# создаем директорию (если ее нет)
[ -d "${d}:" ] || mkdir "${d}:"
# и монтируем в нее соответствующий диск пострадавшего хоста
[ -d "${d}:" ] && mount -t cifs -o user=${u},nobrl,directio -v //${h}/${d}'$' "${d}:";fi
# перемещаем файлы на прежние места
for i in *.infected*;do
mv -v ${i} `grep ${i} _clamav.log.minutf | egrep "^${d}:" | awk -F': moved to ' '{print $1}'`
done
# отмонтировать диск и удалить директорию
umount "${d}:" && rmdir "${d}:"
done
else echo "Врешь...";fi;fi
vbs:
If UCase(Right(WScript.FullName, Len(WScript.FullName)-InStrRev(WScript.FullName,"\"))) <> "CSCRIPT.EXE" Then
Title="recovery false positive - clamav..."
Text = "Запуск в консоли: " & vbNewLine & vbNewLine & " cscript.exe " & WScript.ScriptName & " IVANOVDU \\server\infected\_clamav.log" _
& vbNewLine & vbNewLine & _
"работать дальше в GUI?"
Res=MsgBox(Text,vbYesNo+vbQuestion+vbDefaultButton1,Title)
If Res <> vbNo Then
gui = true
compname = InputBox("Имя ПК куда восстанавливаем: ")
if compname = "" then WScript.Quit
clamavlog = InputBox("Где _clamav.log", "clamavlog", "\\server\infected\_clamav.log")
if clamavlog = "" then WScript.Quit
else
WScript.Quit
end if
End If
if WScript.Arguments.Count = 2 then
compname = WScript.Arguments.Item(0)
clamavlog = WScript.Arguments.Item(1)
end if
if gui = false then
if WScript.Arguments.Count < 2 then
WScript.Echo "Хост не указан"
WScript.Echo "_clamav.log не указан"
WScript.Echo "Пример: cscript util.vbs IVANOVDU ""\\server\infected\_clamav.log"""
WScript.Quit
End If
end if
Set objRegEx = New RegExp : Set objRegExp = New RegExp : Set objRegExp1 = New RegExp
objRegEx.IgnoreCase = True : objRegExp.IgnoreCase = True : objRegExp1.IgnoreCase = True
objRegEx.Global = True : objRegExp.Global = True : objRegExp1.Global = True
objRegExp1.Pattern = ": moved to .*" : objRegExp.Pattern = ".* moved to '|'" : objRegEx.Pattern = "moved to"
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(clamavlog, ForReading)
strLogFile = "_allreturnback_.cmd"
Set objFileCMD = objFSO.CreateTextFile(strLogFile)
Do Until objFile.AtEndOfStream
strSearchString = objFile.ReadLine
Set colMatches = objRegEx.Execute(strSearchString)
If colMatches.Count > 0 Then
For Each strMatch in colMatches
Res = ""+chr(34)+objRegExp.Replace(strSearchString, "")+chr(34)+""
Res1 = replace(""+chr(34)+"\\"+compname+"\"+objRegExp1.Replace(strSearchString, "")+chr(34)+"",":\" , "$\")
objFileCMD.WriteLine "copy /Y " & Res & " " & Res1
Next
End If
Loop
objFileCMD.Close
objFile.Close
wscript.echo "Создан файл исполнения: " & objFSO.GetAbsolutePathName(strLogFile)
Set objRegExp = Nothing
Set objRegExp1 = Nothing
Set objFSO = Nothing
перловый здесь и тут
и батник, вдруг кто-то захочет воспользоваться для сканирования.
@echo off
set pt=%COMPUTERNAME%-%date%-%time:~0,2%%time:~3,2%%time:~6,2%
cmd /Q /C mkdir "\\server\infected\%pt%" && \\server\infected\bin\clamscan.exe -d \\server\pub\antivir\clamav\base -l "\\server\infected\%pt%\_clamav.log" -r --move="\\server\infected\%pt%" -k -u --memory c: d: e: f: