Шпаргалка сисадмина

Bash и образцы скриптов

14.03.2025 | Категория: Linux

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

Конец скрипта...
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.