Три полезных BASH-скрипта для пользователей Linux
Решил поделиться с вами полезными скриптами, которые пригодятся при использовании Linux-дистрибутивов. Ниже вас ожидает скриншот с исходным кодом скрипта и объяснением того, что он делает. В самом конце статьи оставлю ссылку на репозитории в своем GitHub, где будут расположены готовые скрипты.
🧹 Очистка кэша памяти и отображение дискового пространства
Этот скрипт выполняет две важные функции для пользователей Linux.
Первая функция — очистка кэша памяти. Когда вы используете свой компьютер, операционная система Linux сохраняет данные в кэше для быстрого доступа к ним в будущем. Однако, кэш может иногда занимать слишком много памяти, что может замедлять вашу систему. Эта команда очистит кэш памяти и освободит занятую им память, что поможет ускорить вашу систему.
Вторая функция — отображение использования дискового пространства. Когда вы работаете на Linux, вам может потребоваться знать, сколько места осталось на жестком диске. Команда df -h показывает текущее использование дискового пространства и поможет вам планировать свое хранение файлов.
🔎 Поиск файла в директории
Этот скрипт позволяет быстро найти файл в заданных директориях на вашей системе Linux.
Когда вы запустите скрипт, он запросит имя файла, который вы ищете, а затем запросит директории, в которых нужно искать этот файл. Затем скрипт проверит каждую директорию и сообщит вам, если файл был найден в одной из них.
Вы можете использовать этот скрипт, чтобы быстро найти файл на вашей системе без необходимости искать в каждой директории вручную.
🗄️ Резервное копирование директориии с последующим сжатием
Этот скрипт создает резервную копию директории, которую вы выбрали, в другой директории на вашей системе Linux. Затем он предлагает вам сжать резервную копию в архив, чтобы сэкономить место на диске и упростить хранение копии.
Когда вы запустите скрипт, он запросит директорию, которую нужно скопировать, и директорию, в которую нужно создать резервную копию. Затем он скопирует директорию в указанное место и сообщит вам об успешном завершении операции. Если вы хотите сжать резервную копию в архив, скрипт запросит имя архива и выполнит сжатие в формате .tar.gz.
🏁 Подведем итог
Уверен, что найдутся пользователи, которым эти скрипты будут полезны. Если же какого-либо функционала будет недоставать или нужно будет изменить принцип работы скрипта, то вы всегда сможете сделать это, скачав их к себе на устройство. Скачать скрипты вы можете через мой репозиторий в GitHub по ссылке ниже.
Напишите в комментариях, интересны ли вам подобные подборки полезных скриптов и стоит ли продолжать их периодически выкладывать?
27. bash скрипты №1
Изучать что-то новое может быть интересно — новые знания, новый опыт. Вот мы изучили рейд, лвм, файловые системы и всё такое, попрактиковались пару раз – всё довольно просто. Но вы устраиваетесь на работу, там есть какая-то инфраструктура и ваша задача – администрировать эту инфрастуктуру. И то что вчера было новым и интересным превращается в рутину – вам постоянно нужно работать с одними и теми же командами, изо дня в день, годами. Где-то пользователей создать и права настроить, где-то бэкап сделать, где-то ещё что. И люди ищут способы, как бы это всё автоматизировать. Автоматизировать графический интерфейс довольно сложно. Писать новую программу ради какой-то рутины не всегда стоит того. И тут текстовый интерфейс раскрывает себя во всей красе. Можно написать так называемые сценарии, какие команды и как будут выполняться. И запускать этот сценарий вручную, либо автоматизировать его запуск, что вообще позволит админу избавиться от рутины.
Мы работаем с bash, поэтому будем учиться писать сценарии для него. Более привычное название – скрипты. Кто-то называет это «bash программированием». И давайте сразу поставим себе задачу, которую будем решать с помощью скрипта. Начнём с чего-то простого – создать двух пользователей:
- Основная группа — it
- it – группа с правами суперпользователя
- Домашняя директория в /home/it
- Оболочка — /bin/bash
- Основная группа — users
- Домашняя директория в /home/users
- Оболочка — /sbin/nologin
Один из них — user1 — его основная группа будет it, у которой будут права суперпользователя, его домашняя директория будет внутри директории /home/it и его оболочка будет bash. Второй пользователь – user2 — будет в группе users, домашняя директория внутри директории /home/users, а оболочка nologin. Кстати, попробуйте самостоятельно вспомнить все команды, которые необходимо выполнить.
Для начала вспомним, как это делается. Во первых, нужно создать группы и директории. Создаём группу it:
Группа users есть по умолчанию:
У группы it должны быть права суперпользователя – заходим в:
Дальше нам нужны директории — /home/it и /home/users:
И наконец создаём пользователей:
sudo useradd user1 -g it -b /home/it -s /bin/bash sudo useradd user2 -g users -b /home/users -s /sbin/nologin tail /etc/passwd
Всего у нас получилось 5 команд:
sudo groupadd it sudo visudo sudo mkdir -v /home/it,users> sudo useradd user1 -g it -b /home/it -s /bin/bash sudo useradd user2 -g users -b /home/users -s /sbin/nologin
Теперь давайте сделаем скрипт – просто вставим все эти 5 команд в файл с любым названием:
Каждая команда с новой строки.
Но прежде чем запускать скрипт, надо вернуть всё как было – удаляем пользователей, группу, директории и запись из sudoers:
sudo userdel -r user1 sudo userdel -r user2 sudo groupdel it sudo rm -r /home/ sudo visudo sudo grep «%it» /etc/sudoers
Запускаем скрипт с помощью bash:
У меня открылся visudo – это один из шагов, когда мне нужно добавить группу it в sudoers. Добавил, сохранил. Теперь опять проверяем:
всё создалось. И это одной командной, не считая ручного заполнения visudo.
Но.. мы говорим про автоматизацию, а мне всё равно приходится добавлять запись в sudoers вручную. Давайте сделаем так, чтобы запись добавлялась без нашего участия. Помните, как мы делали с рейдом – писали echo текст и направляли в файл? Сделаем точно также. Заменим в нашем файле visudo на echo:
Возьмём текст в одинарные кавычки, чтоб баш никак не обработал команду и направим этот текст в файл /etc/sudoers:
echo '%it ALL=(ALL) ALL' >> /etc/sudoers
с помощью двух символов больше, чтобы не перезаписать файл, а дополнить. Правда сама такая команда не сработает – перенаправление вывода (>>) выполняется от моей оболочки, не от команды sudo, а у моего пользователя не хватит прав записать что-то в sudoers.
sudo echo '%it ALL=(ALL) ALL' >> /etc/sudoers
Можно, конечно, использовать команду tee, но, вообще, учитывая, что все команды тут выполняются с sudo, легче сделать по другому. Просто сотрём отсюда все sudo, а при запуске, вместо bash myscript будем писать:
Тогда весь скрипт будет выполняться в оболочку суперпользователя – это и избавит нас от проблемы с перенаправлением вывода и не будет необходимости внутри скрипта запускать sudo.
Но неплохо было бы на всякий случай сделать копию файла sudoers, чтобы случайно его не испортить. Добавим команду в начале скрипта:
Хорошо, теперь опять удалим то что создали:
sudo userdel -r user1 sudo userdel -r user2 sudo groupdel it sudo rm -r /home/it,users> sudo visudo cp /etc/sudoers.bkp>
sudo bash myscript tail -2 /etc/passwd sudo tail -1 /etc/sudoers
Сработало – одной командой мы создали всё что нам нужно.
Чтобы наш скрипт выглядел более самостоятельным, то есть, чтобы нам не приходилось каждый раз перед ним писать bash, а также чтобы мы могли делиться этим скриптом с другими, кто, возможно, использует другие оболочки, мы можем внутри самого скрипта указать, а под какой именно интерпретатор написан скрипт. Так как, теоретически, у нас в скрипте могут быть всякие особенности, присущие только bash, которых нет в других интерпретаторах. Но тут могут быть нюансы – нужно понимать, что bash есть во многих системах, но не во всех. Если вы пишете скрипт, который предполагаете использовать не только на GNU/Linux, но и на всяких UNIX-ах, где может не быть bash-а, то лучше писать скрипты под интерпретатор shell. Чтобы указать, с помощью какого интерпретатора запускать скрипт, в первой строчке самого скрипта указываются два символа:
называемые шебанг, после чего указывается путь к интерпретатору, допустим:
Но так как в разных дистрибутивах и системах bash или другой интерпретатор могут находится в разных директориях, есть более универсальный способ написания пути:
Давайте так и оставим. Правда, так как теперь мы будем запускать скрипт напрямую, а не передавая его программе bash, ему понадобятся права для запуска – для этого пишем:
не получится – sudo будет искать программу myscript в директориях её переменной PATH. Либо нужно поместить myscript в одну из директорий переменной PATH, либо явно указывать путь к этому скрипту – достаточно поставить перед ним точку и слеш, если он в текущей директории:
Но наш скрипт получился слишком однозадачным – он нацелен на создание двух конкретных пользователей. Сойдёт на разок, но потом, если понадобится создать ещё пользователей, придётся изменять скрипт. Давайте сделаем наш скрипт более динамическим – добавим в него переменные. Пользователей и группы заменим на переменные – user1,user2,group1,group2, а так как директории совпадают с именами групп, там тоже используем переменные. В строке echo одинарные кавычки, а значит переменная не обработается. Надо немного переделать строчку. Можно по разному, но я просто оставлю переменную group1 за кавычками. Теперь, если мне понадобится выполнить скрипт для других пользователей и групп, я могу просто заменить в начале скрипта значения переменных, вместо того, чтобы переделывать весь скрипт.
Опять же получилось так себе – у нас тут скрипт на двух пользователей в двух группах – а если мне нужно добавить одного или трёх пользователей? Давайте уберём всё что касается user2 и group2. Конечно, для второго пользователя придётся опять запускать скрипт, но динамичность скрипта это компенсирует.
Хотя.. в скрипте всё ещё вручную прописаны переменные user и group. Придётся для каждого пользователя заходить и менять значения. Обычно, когда мы работаем с программами в командной строке, мы передаём ей какие-то параметры. Нельзя ли пользователя и группу передать в виде параметров, чтоб не приходилось менять скрипт? Можно.
Давайте сделаем так – создадим новый скрипт: