Все уроки переехали в: Курс обучения 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 binary
mkdir app
илиmkdir ./app
mv config app/
вместе сmv binary app/
и проверить что это так с помощьюls -lah
cd app
иtouch config.overwrite
mkdir -p temp/info/users
cd ..
и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.txt
cp -a file.txt ~/
илиcp -a file.txt $HOME/
cp -a file.txt txt.file
mkdir directory
и потомmv *.* directory
(осторожно, если есть еще файлы с точкой то скопирует и их)cp -a ./directory ./next_directory
mv next_directory next
rm -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 ' ' -f2
grep '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 | uniq
sort
сортируем в алфавитном порядке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/null
2>/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 python
sudo 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