Bash и образцы скриптов
|
Шпаргалка по Bash
echo # вывод на экран чего либо
$? # системная переменная, содержит в себе код/результат выполнения последней команды (0 - успешно, всё остальное неуспешно)
ls -l # вывод на экран содержимого директории с ключом -l показывает права
mkdir # создать директорию
rm # Удаление файла (-f игнорировать несуществующие файлы и аргументы, ни о чём не спрашивать)
rm -d # Удалить директорию
rm -f # Удалить файл
pwd # посмотреть полный путь
CRONTAB
Настройка расписания для скриптов в конфигурационном файле etc/crontab
min (0-59) - минуты
hour (0-23) - часы
day (1-31) - дни
month (1-12) - месяцы
weekday (0-6) - день недели, 6 - это воскресенье
Сокращения в crontab
1-6 = 1,2,3,4,5,6
* - все допустимые значения
*/3 = 0,3,6,9 ..., - все значения с шагом 3
Допустимые символьные значения: sun, mon..., jun, feb..., @reboot, @yearly, @annually, @montly, @weekley, @daily, @midnight, @hourly.
Файлы расписаний пользователя хранятся тут: /var/spool/cron/crontabs
Запускается с ключами: (ни когда не редактировать файлы расписаний напрямую текстовыми редакторами, только через утилиту crontab с ключами)
Добавить файл расписания
crontab имя_файла
Вывести содержимое текущего файла расписания
crontab -l
Удаление текущего файла расписания
crontab -r
Редактирование текущего файла расписания, и если файла нет, то он создастся новый (при первом запуске будет выведен список поддерживаемых текстовых редакторов)
crontab -e
Запустить crontab от лица другого пользователя
sudo crontab -u username
Пример разовых задач: (такие задачи выполняются только один раз)
at f script.sh 10pm tomorrow job 14 at Sun Jul 9 22:00:00 2007 at f script.sh 2:00 tuesdey job 15 at Tue Jul 10 02:00:00 2007 at f script.sh 2:00 juli 11 job 16 at Wed Jul 11 02:00:00 2007 at f script.sh 2:00 next week job 17 at Sat Jul 14 02:00:00 2007
Примеры записис в файле конфигурации
# в качестве командного интерпретатора использовать /bin/sh SHELL=/bin/sh # результаты работы отправлять по этому адресу MAILTO=paul@example.org # добавить в PATH домашний каталог пользователя PATH=/bin:/usr/bin:/home/paul/bin #### Здесь начинаются задания, # будет выполняться скрипт "script1.sh" каждый день @daily /home/pavel/sendbox/test5/script1.sh # в 05:00 по понедельникам будет выполняться архивация папки "/home/" в файл "/var/backups/home.tgz" при помощи архиватора "tar" с ключами -zcf 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # выполнять каждый день в 0 часов 5 минут, результат складывать в log/daily 5 0 * * * $HOME/bin/daily.job >> $HOME/log/daily 2>&1 # выполнять 1 числа каждого месяца в 14 часов 15 минут 15 14 1 * * $HOME/bin/monthly # каждый рабочий день в 22:00 0 22 * * 1-5 echo "Пора домой" | mail -s "Уже 22:00" john 23 */2 * * * echo "Выполняется в 0:23, 2:23, 4:23 и т. д." 5 4 * * sun echo "Выполняется в 4:05 в воскресенье" 0 0 1 1 * echo "С новым годом!" 15 10,13 * * 1,4 echo "Эта надпись выводится в понедельник и четверг в 10:15 и 13:15" 0-59 * * * * echo "Выполняется ежеминутно" 0-59/2 * * * * echo "Выполняется по четным минутам" 1-59/2 * * * * echo "Выполняется по нечетным минутам" # каждые 5 минут */5 * * * * echo "Прошло пять минут" # каждое первое воскресенье каждого месяца. -eq 7 — код дня недели, т.е. 1 -> понедельник , 2 -> вторник и т.д. 0 1 1-7 * * [ "$(date '+\%u')" -eq 7 ] && echo "Эта надпись выводится каждое первое воскресенье каждого месяца в 1:00"
ПЕРЕМЕННЫЕ
peremennaya=znachenie # Переменной "peremennaya" присваимаем значение "znachenie" без пробелов unset=peremennaya # Удалить переменную peremennaya='ls' # Переменной "peremennaya" присваимаем вывод команды "ls" peremennaya=$(ls -l) # Другой вариант - Переменной "peremennaya" присваимаем вывод команды "ls" с флагом -l. Этот вариант удобнее, так как можно добавлять различные ключи и флаги к команде.
Циклы for
Структура:
for переменная in диапазон # Диапазон указывается в фигурных скобках { } do Действие # Указываем что мы будем делать с переменной, которой уже присвоен некий диапазон done
# пример
for peremennay in {1..12} # для переменной "peremennay" присваиваем диапазон { } от 1 до 12 do # выполнить следующее... echo $peremennay # вывести на экран значение переменной $peremennay (тут может быть любая команда или вложенный цикл или условие) done # закрывающий тег цикла
# Другой вариант написания цикла
#!/bin/bash for (( c=1; c<=5; c++)) # через ; c=1 присвоили переменной "c" значение "1", далее c<=5 определяем условие, далее c++ это действие приращение do echo "попытка номер $c" done
# Аналогичная запись
for c in {1..5} do echo "попытка номер $c" done
Условный оператор "if" - Сравнение/условие
Структура:
if условие # после "if" задаётся некоторое условие then # тогда действие # если условие выполняется то выполняем некое действие else # если условие НЕвыполняется, то... (else может быть или не быть в зависимости от логики) действие в противном случае # то выполняем противное действие fi # Закрывающий тег (обратное от "fi")
# пример 1
a=3 # присвоили переменной "a" значение "3" if [ $a = 3 ] # Если $a равно 3, Важно: пробел после [ и пробел до ] then # Тогда echo YES # Показать YES fi # Закрывающий тег (обратное от "fi")
# пример 2
if [ $a = 3 ]; then echo YES; fi # Тоже самое в одну строку ; - точка с запятой обязательно
# пример 3 (Улучшенные сравнения)
if [[ 2 < 3 ]] # если 2 меньше 3 (можно использовать более привычный синтаксис) then # тогда echo YES # вывести на экран YES fi # Закрывающий тег (обратное от "fi")
Конвеер
cmdfirst | cmdsecond # передаем вывод первой программы на вход другой команды
Последовательный запуск команд
cmdfirst; cmdsecond
Эквивалентно
cmdfirst cmdsecond
Последовательный запуск команд с условием
cmdfirst && cmdsecond # вторая команда запустится только если первая завершилась успешно, тоесть результат первой команды $?=0 (логическое И) cmdfirst || cmdsecond # вторая команда запустится только если первая завершилась НЕуспешно, тоесть результат первой команды $=1 (логическое ИЛИ)
Арифметика
let "c=a+b" # Присваеваем переменной "c" результат сложения a+b ("a" и "b" могут быть просто цифрами или другими переменными)
или
c='expr $a + $b' # Тоже самое, но другой вид. Важно применить одинарные кавычки НЕ ЗАБЫТЬ ПРО КАВЫЧКИ
или
c=$(( $a + $b )) # Тоже самое в другом виде, такая кострукция более гибкая
Образцы скриптов
Скрипт "Определение наибольшего потребления дискового пространства"
#!/bin/bash # Определение наибольшего потребления дискового пространства # для определенных папок # Список директорий для проверки check_directories="/var/log /tmp /fake" # Определяем формат даты для имени файла отчёта (присваемаем переменной "DATE" значение даты с указанием формата даты) DATE=$(date '+%Y%m%d') # Перенаправляем весь вывод в файл отчёта в текстовом формате exec > space_$DATE.rpt # Заголовок echo "Крупнейшие потребители диского пространства" echo "для директорий $check_directories" for dir_check in $check_directories do # Создаем подзаголовок echo # просто пропуск строки для удобства представления echo "Директория $dir_check" # Название подзаголовка if [ -e $dir_check ] # условие - проверяем существует ли проверяемая директория с помощью ключа -e then # если уловие выполняется тогда... du -h $dir_check 2> /dev/null | #Определяем занятое пространство (2> /dev/null - это перенаправление ошибок/или их отключение) и передаём по конвееру | далее на команду sort sort -rh # Сортируем вывод (-r реверсивная сортировка), (-h сравнивать числа в удобном для человека виде) else # Иначе, если условие не выполненно, то есть директория не существует, то... echo "Директория $dir_chek не существует" # выводим текст fi # Закрывающий тег (обратное от "fi") done # Проверка успешного завершения 0-упешно, любая другая цифра неуспешно echo $? Конец скрипта...
Скрипт "Поиск и замена строчных букв на заглавные и удаление пустых строк
#!/bin/bash # Удаление пустых строк в тексте и замена маленьких на большие # Задаём переменную пути к файлу text="/home/pavel/sendbox/test/text.txt" # Удаление пустых строк (работает), опция -i позволяет перезаписать файл при помощи SED sed -i '/^$/d' $text # замена строчных символов на заглавные при помощи SED sed -i 's/[a-z]/\U&/g' $text # замена строчных символов на заглавные при помощи tr tr [:lower:] [:upper:] < $text > /home/pavel/sendbox/test/text3.txt Конец скрипта...
Скрипт "Отслеживание неудачных авторизаций по файлу /var/log/auth.log"
#!/bin/bash # Отслеживание неудачных авторизаций # переменная файла лога авторизаций log="/var/log/auth.log" #log="/home/pavel/sendbox/log.txt" # Определяем формат даты для имени файла отчёта date=$(date '+%Y%m%d') # Делаем вывод в файл отчёта в текстовом формате exec > log_auth_$date.rpt # Заголовок echo echo "Попытки неудачной авторизации" echo echo "##############################" for logs in $log do # Подзаголовок echo echo "Анализ файла $log" echo # Находим в файле строки по заданному шаблону и выводим их в stdout if sed -n /authentication.failure/p $logs then # комментарий к первой команде echo echo "##### ВНИМАНИЕ! Найдено нарушение доступа #####" echo # Отправить результат на почту sed -n /authentication.failure/p $logs | mail -s "Report" p.sulimov@aramie.ru # комментарий ко второй команде sort -rh else echo echo "нарушений небыло" echo fi done Конец скрипта...