Все уроки переехали в: Курс обучения DevOps
Для того чтобы при выполении команды sudo ... не писать каждый раз пароль
sudo grep -q "ALL ALL = (ALL) NOPASSWD: ALL" /etc/sudoers >/dev/null || sudo sh -c "echo 'ALL ALL = (ALL) NOPASSWD: ALL' >> /etc/sudoers"
Обновим список версий установленных пакетов и установим для них обновления
sudo apt update -qq && sudo apt upgrade -y -qqУстановим несколько полезных программ
- ncdu - более удобный аналог du
- ripgrep - более быстрый и удобный аналог grep
- lnav - более удобный аналог less
- jq - для работы с json файлами (например поиска в файле имен)
- nano - текстовый редактор, вместо vi или vim
- wget - поможет скачать что-либо из интернета
- curl - с его помощью можно делать HTTP запросы прямо из консоли, например
curl google.com
sudo apt install -y -qq ncdu ripgrep lnav jq nano wget curl
Заменим стандарные утилиты на более удобные (погугли alias bash)
grep -q 'rg' ${HOME}/.bash_aliases || echo -e "alias grep='rg'" >> ${HOME}/.bash_aliases grep -q 'ncdu' ${HOME}/.bash_aliases || echo -e "alias du='ncdu'" >> ${HOME}/.bash_aliases grep -q 'lnav' ${HOME}/.bash_aliases || echo -e "alias less='lnav'" >> ${HOME}/.bash_aliases
Все действия выше одним скриптом
#!/bin/bash sudo grep -q "ALL ALL = (ALL) NOPASSWD: ALL" /etc/sudoers >/dev/null || sudo sh -c "echo 'ALL ALL = (ALL) NOPASSWD: ALL' >> /etc/sudoers" sudo apt update -qq && sudo apt upgrade -y -qq sudo apt install -y -qq ncdu ripgrep lnav jq nano wget curl grep -q 'rg' ${HOME}/.bash_aliases || echo -e "alias grep='rg'" >> ${HOME}/.bash_aliases grep -q 'ncdu' ${HOME}/.bash_aliases || echo -e "alias du='ncdu'" >> ${HOME}/.bash_aliases grep -q 'lnav' ${HOME}/.bash_aliases || echo -e "alias less='lnav'" >> ${HOME}/.bash_aliases
- Перейди в
/tmpдиректорию - Вернитесь обратно в директорию в которой были первоначально
- Перейди в домашнюю директорию пользователя
- Перейди в вышестоящую директорию
- Перейди в корень (что такое корень?)
- Выполни команду
cd ~, куда вы попали? - Выведи на экран полный путь к директории где ты сейчас находишься
Решение первого задания
#!/bin/sh echo -n "Мы сейчас находимся в директории: " # выводим текст на экран и не переносим строку с помощь параметра -n # чтобы вывод следующей команды pwd был после нашей фразы, например: 'Мы сейчас находимся в директории: /home/user' pwd echo -n "1. Перешли в директорию: " cd /tmp && pwd # используем && что значит 'И' то есть если успешно выполнилась `cd /tmp` то делать `pwd` echo -n "2. Вернулись в директорию: " cd - echo -n "3. Перешли в директорию: " cd && pwd echo -n "4. Перешли в директорию: " cd .. && pwd echo -n "5. Перешли в кореневую директорию (директория которая является вышестоящей для всех существующих файлов и директорий): " cd / && pwd echo -n "6-7. Перешли в домашнюю директорию: " cd ~ && pwd
- Создай два файла с именами
configиbinary - Создай директорию
app - Перемести файлы
configиbinaryв директориюapp - Создай в директории
appподпапкиtemp/info/usersодной командой - Вернись на директорию выше и удали директорию
app
Решение второго задания
touch config binary,touch ./config ./binary,touch configвместе сtouch binarymkdir appилиmkdir ./appmv config app/вместе сmv binary app/и проверить что это так с помощьюls -lahcd appиtouch config.overwritemkdir -p temp/info/userscd ..иrm -rfv app
- Создай пустой файл
file.txtв директории/tmp - Скопируй
file.txtфайл в свою домашнюю директорию - Создай копию файла
file.txtкоторая будет называтьсяtxt.file - Создай директорию
directoryи перемести в нее файлыfile.txtиtxt.file - Создай копию директории
directoryкоторая будет называтьсяnext_directory - Переименуй
next_directoryвnext - Удали обе директории которые создал и все файлы одной командой
Решение третьего задания
cd /tmpиtouch file.txtcp -a file.txt ~/илиcp -a file.txt $HOME/cp -a file.txt txt.filemkdir directoryи потомmv *.* directory(осторожно, если есть еще файлы с точкой то скопирует и их)cp -a ./directory ./next_directorymv next_directory nextrm -rfv next directory
В директори есть файл в котором написан список IP адресов, вычисли какой из них чаще всего повторяется (использовать файл ip_list
Решение четвертого задания
cut -d' ' -f1выведем только IP адреса, без всего лишнегоsort -nотсортируем их тем самым сгрупировав одинаковыеuniq -cвыведем количество одинаковых повторений IPcut -d' ' -f1 ip_list | sort -n | uniq -cсовместим все три команды передавая вывод одной в другую через|
Вывести только время когда была установлена последняя программа (не запись в man-db). История установки программ хранится в файле /var/log/dpkg.log
Решение пятого задания
- Перейдем в директорию с файлом
cd /var/log/ - Посмотрим содержимое файла
less /var/log/dpkg.logв котором можно делать поиск нажав/и введя слово, напримерinstalled grep 'installed' dpkg.log | grep -v 'man-db' | tail -1 | cut -d ' ' -f2grep 'installed' dpkg.log- поиск строк с словом installed в файле логаgrep -v 'man-db'- убрать строки с обновлением man-db во всех страках с installedtail -1- вывести 1 последнюю строкуcut -d ' ' -f2- вывести только время (можно еще и дату для удобстваcut -d ' ' -f1-2)
- Отсортировать
names.txtв алфавитном порядке и убрать повторения - Записать отсортированный список имен в файл
names_sorted.txt - Дописать в конец файла
names_sorted.txtимена с файлаnames_new.txt
Решение шестого задания
sort | uniqsortсортируем в алфавитном порядкеuniqсклеивает повторяющиеся строки в одну
sort | uniq > names_sorted.txt>перезаписывает содержимое файлаnames_sorted.txtвыводом командыuniq
cat names_new.txt >> names_sorted.txt>>дописывает в конец файлаnames_sorted.txtвывод команды cat (содержимое файлаnames_new.txt)
- Вывести все файлы из папки
/etcв которых есть имя вашего пользователя - Не выводить ошибки при поиске
Решение восьмого задания
grep -i 'Aider' /etc/*/etc/*поиск по всем файлам в папке/etc-iозначает не учитывать регистр (найдет: aider, Aider, AIDER, aIDEr, и тд)
grep -i 'Aider' /etc/* 2>/dev/null2>/dev/nullне выводить ошибки
- Упаковать (сжать) в архив все файлы с именами из седьмого задания
- С помощью
tar - С помощью
zip
- С помощью
- Создать папку
unpackи распаковать в нее содержимое архивов по очереди
Решение девятого задания
Ответы на все вопросы тут https://losst.pro/arhivatsiya-v-linux советую пользоваться zip как самым простым или tar как уже установленым в большинстве unix систем (linux)
- Обьяснить какие данные будут выведены на экран в команде
top - Какой командой можно посмотреть использование оперативной памяти?
- В чем разница между
availableиfreeпамятью?
- В чем разница между
- Что такое память
buff/cache? - Посмотреть сколько места занято на диске
/и насколько он нагружен
Решение десятого задания
- top и htop выводят:
- load average - мера потребности в ресурсах CPU и на дисковые ресурсы. Например если 1.5 то это значит что нужна была мощность равная 1 vCPU (ядру) и 0.5 ожидание записи на диск, в сумме получилось 1.5 вот тебе и нагрузка на систему. Выводится как три числа за 1, 5 и 15 минут
- использование оперативной памяти (сколько свободно, сколько всего, сколько занято и тд в mem)
- список процессов отсортированых по использованию CPU (процессора)
- free (-m в мегабайтах или -h для людей)
availableдоступная память часть которой может уже использоваться, но ничего страшного если ее "забрать" и использовать при надобности (например кэш или буфер), аfreeэто которая вообще сейчас не используется ни для чего
- Временные данные, кэш, которые могут быть очищены если оперативная память (RAM) будет нужна какому-то приложению. Например кэш нужен чтобы приложения быстрее запускались
ps aux | grep pythonsudo kill -9 PIDгде PID это числовой индификатор процесса который мы узнали из прошлой команды (ps aux...)df -m(или можно -h) узнать нагрузку на диск можно несколькими способами:iostat -dx DISK_NAMEгде DISK_NAME взято из столбцаFilesystemпервой командыsudo iotop- как top, только для дисков
- Создать скрипт который:
- Может запускать только текущий пользователь
- Устанавит через
apt(только если еще не установлены)curl- выполнять http запросыgit- система для контроля за версиями, может заливать их в публичный репозиторийjq- для работы с файлами json чтобы удобно искать в них или отображать
Решение одиннадцатого задания
-
Создаем скрипт
touch install_apps.shи даем права на запуск только текущему пользователюchmod u+x install_apps.sh- Сам скрипт:
#!/bin/bash sudo apt install -y wget curl git jq- Установка docker будет сложнее так как apt по умолчанию не знает откуда его ставить (нет репозитория с docker в базовом списке репозиториев)
Репозиторий - место откуда скачивать программы (там храняться все версии и туда разработчики загружают новые версии)
#!/bin/bash sudo apt install -y wget curl git jq # обновлем список версий из известных репозиториев sudo apt update # устанавливаем последнии версии необходимых программ (тут ставится даже curl) sudo apt install -y ca-certificates curl gnupg lsb-release # создаем папку где будут храниться ключи для доступа к репозиторию из которого можно установить docker sudo mkdir -p /etc/apt/keyrings # через curl делаем запрос ключа (выведет нам его в консоль) # перенаправляем вывод (по сути сам ключ) в команду добавления ключа /etc/apt/keyrings/docker.gpg curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # записываем данные о репозитории которые будет исопльзовать apt в файл /etc/apt/sources.list.d/docker.list echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # обновляем список программ из репозиториев (обновит список програм которые можно ставить и из нового репозитория docker) sudo apt update # устанавливаем последнюю версию docker вместе с утилитами которые он использует sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # добавляем нашего пользователя в группу docker для того чтобы команды docker работали без sudo sudo usermod -aG docker $USER # включаем автозапуск докера при старте компа sudo systemctl enable docker.service sudo systemctl enable containerd.service echo "Нужно перезапустить компьютер для начала работы с docker" sudo docker --version