Часть II • Защитные операции с использованием bash
# bash getlocal.sh < cmds.txt
# cmds.txt — это файл со списком команд для выполнения
#
# SepCmds - отделение команд от строки ввода
function SepCmds()
{
LCMD=${ALINE%%|*}
REST=${ALINE#*|}
WCMD=${REST%%|*}
REST=${REST#*|}
TAG=${REST%%|*}
if [[ $OSTYPE == "MSWin" ]]
then
CMD="$WCMD"
else
CMD="$LCMD"
fi
}
function DumpInfo ()
{
printf 'printf ' date="%s" time="%s">\n' "$(date '+%F')" "$(date '+%T')"
readarray CMDS
for ALINE in "${CMDS[@]}"
do
# игнорировать комментарии
if [[ ${ALINE:0:1} == '#' ]] ; then continue ; fi
SepCmds
if [[ ${CMD:0:3} == N/A ]]
then
continue
else
printf "<%s>\n" $TAG
$CMD
printf "%s>\n" $TAG
fi
done
printf "\n"
}
OSTYPE=$(./osdetect.sh)
HOSTNM=$(hostname)
TMPFILE="${HOSTNM}.info"
# собрать в tmp-файл как информацию, так и ошибки
DumpInfo > $TMPFILE 2>&1
Глава 5. Сбор информации
79
.После.двух.определений.функций.сценарий.начинается.вызовом.нашего.скрипта.
osdetect.sh
.(из.главы.2)..В.качестве.местоположения.сценария.
osdetect.sh
.мы.
указали.текущий.каталог..Вы.можете.поместить.файл.в.другое.место,.но.затем.
обязательно.измените.заданный.путь.с.
./
,.указав.тот.адрес,.по.которому.находится.
данный.сценарий,.и/или.добавьте.это.местоположение.в.переменную.
PATH
.
Чтобы сделать работу более эффективной, можете включить сценарий osdetect.sh
непосредственно в getlocal.sh.
.Затем.мы.запускаем.программу.
hostname
.в.подоболочке,.чтобы.получить.имя.
этой.системы.для.использования.в.следующей.строке,.а.позже.—.в.функции.
DumpInfo
.
.Мы.используем.имя.хоста.как.часть.временного.имени.файла,.в.который.мы.
поместим.весь.наш.вывод.
.Здесь.мы.вызываем.функцию,.которая.будет.выполнять.большую.часть.работы.
этого.скрипта..При.вызове.функции.мы.перенаправляем.и.stdout,.и.stderr.в.один.
и.тот.же.файл,.чтобы.функция.не.устанавливала.перенаправление.ни.на.один.из.
своих.выходных.операторов;.функция.может.вносить.записи.в.stdou
t
,.и.при.необ-
ходимости.этот.вызов.перенаправит.весь.вывод..Другой.способ.выполнить.пере-
направление.—.поместить.его.перед.закрывающей.скобкой.определения.функции.
DumpInfo
..Вместо.этого.перенаправление.stdout.может.быть.оставлено.на.усмотре-
ние.пользователя,.вызывающего.скрипт;.по.умолчанию.же.все.будет.записываться.
в.stdout..Но.если.пользователь.хочет,.чтобы.вывод.отправлялся.в.файл,.ему.нужно.
создать.файл.с.именем.
tempfile
.и.помнить,.что.stderr.перенаправляется.именно.
в.него..Наш.пример.рассчитан.на.менее.опытных.пользователей.
.Здесь.начинается.самая.важная.часть.сценария..Начало.функции.—.вывод.
XML-тега.
,.который.будет.иметь.свой.закрывающий.тег,.записанный.
в.конце.этой.функции.
.Команда.
readarray
.в.bash.будет.читать.все.строки.ввода.(до.конца.читаемого.
файла.или.при.нажатии.сочетания.клавиш.
Ctrl
+
D
)..Каждая.строка.будет.отдельно.
записана.в.массив,.в.данном.случае.
CMDS
.
.
for
.зацикливает.значения.массива.
CMDS
.—.по.одной.строке.за.один.проход.
.В.этой.строке.используется.операция.подстроки,.чтобы.извлечь.из.переменной.
ALINE
.символ.в.позиции.0.длины.1..Хештег.(
#
).заключен.в.кавычки,.чтобы.оболочка.
не.интерпретировала.его.как.начало.комментария.скрипта.
80
Do'stlaringiz bilan baham: |