Основное назначение скрипта - экспорт файлов журналов для обработки данных. Кажется, что все работает, ожидают 3 основных вопроса
- Начальное начало печати индикатора выполнения перекошено. Где самое правильное «]» изначально напечатано в неправильной строке. Строка выше, где это должно быть.
2. Строка загрузки, показывающая ход выполнения скрипта (какой файл извлекается и экспортируется), кажется, искажается в окончательном выводе скрипта, как кажется, две отдельные строки наедине с остатком
3. «Не удалось экспортировать журнал ...» - это ошибка, полученная во время / после запуска сценария (хотя я предполагаю, что это возможно из-за проблемы с привилегиями.)
По существу, в конце скрипта я бы хотел, чтобы они были одной чистой полосой загрузки, показывающей, что скрипт выполнил свою задачу. Кроме того, если возможно, я хотел бы разработать какую-то условную функцию, которая бы информировала пользователя, если на самом деле возникла проблема # 3, «Не удалось экспортировать журнал ...» или «Невозможно получить доступ в ...», и сообщить пользователь в конце скрипта. Таким образом, пользователь будет знать, чтобы повысить привилегии или работать в качестве администратора, а затем повторите попытку.
Надеюсь, здесь нет ничего странного в том коде, который у меня есть до сих пор ...
#!/bin/bash
#
# Description: Gather windows log file copies into folder--also allows for transfer if the user would like
#
# Usage:
# winlogs.sh [-z]
# -z Tar and zip the output
TGZ=0
if (( $# > 0 ))
then
if [[ ${1:0:2} == '-z' ]]
then
TGZ=1
shift
fi
fi
SYSNAM=$(hostname)
LOGDIR=${1:-/tmp/${SYSNAM}_logs}
mkdir -p $LOGDIR
cd ${LOGDIR} || exit -2
tput sc # save pointer/reference to current terminal line
erase=$(tput el) # save control code for 'erase (rest of) line'
# init some variables; get a count of the number of files so we can pre-calculate the total length of our status bar
modcount=20
logcount=$( wevtutil el | wc -l)
# generate a string of filecount/20+1 spaces (35+1 for my particular \bin)
barspace=
for i in $(seq 1 $(( ${logcount} / ${modcount} + 1 )) )
do
barspace="${barspace} "
done
barhash= # start with no #'s for this variable
logcount=0 # we'll re-use this variable to keep track of # of files processed so need to reset
while read -r filename
do
logcount=$((logcount+1))
tput rc # return cursor to previously saved terminal line (tput sc)
# print filename (1st line of output); if shorter than previous filename we need to erase rest of line
filename="${filename%$'\r'}"
printf "log files: ${filename}${erase}\n"
printf "\n"
while read -r EXPORT
do
SAFNAM="${filename// /_}"
SAFNAM="${SAFNAM//\//-}"
#wevtutil epl "$filename" "${SYSNAM}_${SAFNAM}.evtx" | sort -V
done < <( wevtutil epl "$filename" "${SYSNAM}_${SAFNAM}.evtx" | sort -V )
# print our status bar (2nd line of output) on the first and every ${modcount} pass through loop;
if [ ${logcount} -eq 1 ]
then
printf "[${barhash}${barspace}]\n"
elif [[ $((logcount % ${modcount} )) -eq 0 ]]
then
# for every ${modcount}th file we ...
barspace=${barspace:1:100000} # strip a space from barspace
barhash="${barhash}#" # add a '#' to barhash
printf "[${barhash}${barspace}]\n" # print our new status bar
fi
done < <(wevtutil el | sort -V) #&& ( wevtutil epl "$filename" "${SYSNAM}_${SAFNAM}.evtx" | sort -V )
# finish up the status bar (should only be 1 space left to 'convert' to a '#')
#sed '/Failed/I,d' && sed '/the file exsists/I, d'
if (( TGZ == 1 ))
then
tar -cvzf ${SYSNAM}_logs.tgz *.evtx
fi
tput rc
printf "Log Search/Retrieval: -- Complete. -- \n"
if [ ${#barspace} -gt 0 ]
then
barspace=${barspace:1:100000}
barhash="${barhash}#"
fi
printf "[${barhash}${barspace}]\n"