Skip to content

eabykov/devops-linux

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Все уроки переехали в: Курс обучения DevOps

Задания по Linux (все файлы для выполнения заданий находятся в данном репозитории)

Перед началом выполнить комманды по очереди:

Для того чтобы при выполении команды 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

Первое задание

  1. Перейди в /tmp директорию
  2. Вернитесь обратно в директорию в которой были первоначально
  3. Перейди в домашнюю директорию пользователя
  4. Перейди в вышестоящую директорию
  5. Перейди в корень (что такое корень?)
  6. Выполни команду cd ~, куда вы попали?
  7. Выведи на экран полный путь к директории где ты сейчас находишься
Решение первого задания
#!/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

Второе задание

  1. Создай два файла с именами config и binary
  2. Создай директорию app
  3. Перемести файлы config и binary в директорию app
  4. Создай в директории app подпапки temp/info/users одной командой
  5. Вернись на директорию выше и удали директорию app
Решение второго задания
  1. touch config binary, touch ./config ./binary, touch config вместе с touch binary
  2. mkdir app или mkdir ./app
  3. mv config app/ вместе с mv binary app/ и проверить что это так с помощью ls -lah
  4. cd app и touch config.overwrite
  5. mkdir -p temp/info/users
  6. cd .. и rm -rfv app

Третье задание

  1. Создай пустой файл file.txt в директории /tmp
  2. Скопируй file.txt файл в свою домашнюю директорию
  3. Создай копию файла file.txt которая будет называться txt.file
  4. Создай директорию directory и перемести в нее файлы file.txt и txt.file
  5. Создай копию директории directory которая будет называться next_directory
  6. Переименуй next_directory в next
  7. Удали обе директории которые создал и все файлы одной командой
Решение третьего задания
  1. cd /tmp и touch file.txt
  2. cp -a file.txt ~/ или cp -a file.txt $HOME/
  3. cp -a file.txt txt.file
  4. mkdir directory и потом mv *.* directory (осторожно, если есть еще файлы с точкой то скопирует и их)
  5. cp -a ./directory ./next_directory
  6. mv next_directory next
  7. rm -rfv next directory

Четвертое задание

В директори есть файл в котором написан список IP адресов, вычисли какой из них чаще всего повторяется (использовать файл ip_list

Решение четвертого задания
  1. cut -d' ' -f1 выведем только IP адреса, без всего лишнего
  2. sort -n отсортируем их тем самым сгрупировав одинаковые
  3. uniq -c выведем количество одинаковых повторений IP
  4. cut -d' ' -f1 ip_list | sort -n | uniq -c совместим все три команды передавая вывод одной в другую через |

Пятое задание

Вывести только время когда была установлена последняя программа (не запись в man-db). История установки программ хранится в файле /var/log/dpkg.log

Решение пятого задания
  1. Перейдем в директорию с файлом cd /var/log/
  2. Посмотрим содержимое файла less /var/log/dpkg.log в котором можно делать поиск нажав / и введя слово, например installed
  3. grep 'installed' dpkg.log | grep -v 'man-db' | tail -1 | cut -d ' ' -f2
    • grep 'installed' dpkg.log - поиск строк с словом installed в файле лога
    • grep -v 'man-db' - убрать строки с обновлением man-db во всех страках с installed
    • tail -1 - вывести 1 последнюю строку
    • cut -d ' ' -f2 - вывести только время (можно еще и дату для удобства cut -d ' ' -f1-2)

Шестое задание

  1. Отсортировать names.txt в алфавитном порядке и убрать повторения
  2. Записать отсортированный список имен в файл names_sorted.txt
  3. Дописать в конец файла names_sorted.txt имена с файла names_new.txt
Решение шестого задания
  1. sort | uniq
    • sort сортируем в алфавитном порядке
    • uniq склеивает повторяющиеся строки в одну
  2. sort | uniq > names_sorted.txt
    • > перезаписывает содержимое файла names_sorted.txt выводом команды uniq
  3. cat names_new.txt >> names_sorted.txt
    • >> дописывает в конец файла names_sorted.txt вывод команды cat (содержимое файла names_new.txt)

Восьмое задание

  1. Вывести все файлы из папки /etc в которых есть имя вашего пользователя
  2. Не выводить ошибки при поиске
Решение восьмого задания
  1. grep -i 'Aider' /etc/*
    • /etc/* поиск по всем файлам в папке /etc
    • -i означает не учитывать регистр (найдет: aider, Aider, AIDER, aIDEr, и тд)
  2. grep -i 'Aider' /etc/* 2>/dev/null
    • 2>/dev/null не выводить ошибки

Девятое задание

  1. Упаковать (сжать) в архив все файлы с именами из седьмого задания
    1. С помощью tar
    2. С помощью zip
  2. Создать папку unpack и распаковать в нее содержимое архивов по очереди
Решение девятого задания

Ответы на все вопросы тут https://losst.pro/arhivatsiya-v-linux советую пользоваться zip как самым простым или tar как уже установленым в большинстве unix систем (linux)

Десятое задание

  1. Обьяснить какие данные будут выведены на экран в команде top
  2. Какой командой можно посмотреть использование оперативной памяти?
    1. В чем разница между available и free памятью?
  3. Что такое память buff/cache?
  4. Посмотреть сколько места занято на диске / и насколько он нагружен
Решение десятого задания
  1. top и htop выводят:
    • load average - мера потребности в ресурсах CPU и на дисковые ресурсы. Например если 1.5 то это значит что нужна была мощность равная 1 vCPU (ядру) и 0.5 ожидание записи на диск, в сумме получилось 1.5 вот тебе и нагрузка на систему. Выводится как три числа за 1, 5 и 15 минут
    • использование оперативной памяти (сколько свободно, сколько всего, сколько занято и тд в mem)
    • список процессов отсортированых по использованию CPU (процессора)
  2. free (-m в мегабайтах или -h для людей)
    1. available доступная память часть которой может уже использоваться, но ничего страшного если ее "забрать" и использовать при надобности (например кэш или буфер), а free это которая вообще сейчас не используется ни для чего
  3. Временные данные, кэш, которые могут быть очищены если оперативная память (RAM) будет нужна какому-то приложению. Например кэш нужен чтобы приложения быстрее запускались
  4. ps aux | grep python
  5. sudo kill -9 PID где PID это числовой индификатор процесса который мы узнали из прошлой команды (ps aux...)
  6. df -m (или можно -h) узнать нагрузку на диск можно несколькими способами:
    • iostat -dx DISK_NAME где DISK_NAME взято из столбца Filesystem первой команды
    • sudo iotop - как top, только для дисков

Одиннадцатое задание

  1. Создать скрипт который:
    1. Может запускать только текущий пользователь
    2. Устанавит через apt (только если еще не установлены)
      • curl - выполнять http запросы
      • git - система для контроля за версиями, может заливать их в публичный репозиторий
      • jq - для работы с файлами json чтобы удобно искать в них или отображать
Решение одиннадцатого задания
  1. Создаем скрипт touch install_apps.sh и даем права на запуск только текущему пользователю chmod u+x install_apps.sh

    1. Сам скрипт:
    #!/bin/bash
    
    sudo apt install -y wget curl git jq
    1. Установка 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