252 lines
12 KiB
Go
252 lines
12 KiB
Go
package linuxmodules
|
||
|
||
import (
|
||
"fmt"
|
||
"rubric/utils"
|
||
)
|
||
|
||
var ToolsModule = Module{
|
||
Key: "tools",
|
||
Aliases: []string{"t", "cockpit", "regex", "awk", "sed", "инструменты"},
|
||
Title: "Веб-интерфейс и текстовые инструменты",
|
||
Description: "Темы 60–61: Cockpit, глоббинг, регулярные выражения, grep, sed, awk",
|
||
Run: showTools,
|
||
}
|
||
|
||
func showTools() {
|
||
utils.Header("Linux — Веб-интерфейс и текстовые инструменты")
|
||
|
||
// ─── 60. Cockpit ──────────────────────────────────────────────
|
||
utils.Section("60. Веб-интерфейс — Cockpit")
|
||
|
||
utils.Println("Cockpit — веб-консоль для администрирования Linux через браузер.")
|
||
utils.Println("Позволяет управлять сервисами, сетью, дисками, контейнерами и логами.")
|
||
fmt.Println()
|
||
utils.Println(utils.ColorBold + "Установка и запуск:" + utils.ColorReset)
|
||
utils.Code(`# RHEL/Fedora (обычно предустановлен):
|
||
dnf install cockpit
|
||
systemctl enable --now cockpit.socket
|
||
|
||
# Ubuntu/Debian:
|
||
apt install cockpit
|
||
systemctl enable --now cockpit.socket
|
||
|
||
# Открыть порт в firewalld:
|
||
firewall-cmd --permanent --add-service=cockpit
|
||
firewall-cmd --reload
|
||
|
||
# Доступ: https://hostname:9090
|
||
# Войти с логином/паролем системного пользователя`)
|
||
|
||
utils.Println(utils.ColorBold + "Расширения Cockpit:" + utils.ColorReset)
|
||
utils.Code(`# Управление виртуальными машинами:
|
||
dnf install cockpit-machines
|
||
|
||
# Управление Podman-контейнерами:
|
||
dnf install cockpit-podman
|
||
|
||
# Управление хранилищем (LVM, RAID, Stratis):
|
||
dnf install cockpit-storaged
|
||
|
||
# 389 DS (LDAP):
|
||
dnf install cockpit-389-ds
|
||
|
||
# Обновления пакетов:
|
||
dnf install cockpit-packagekit
|
||
|
||
# Применить все расширения:
|
||
systemctl restart cockpit.socket`)
|
||
|
||
utils.Println(utils.ColorBold + "Возможности Cockpit:" + utils.ColorReset)
|
||
utils.Code(`Dashboard — обзор системы: CPU, RAM, диски, сеть
|
||
Services — управление systemd-сервисами
|
||
Storage — диски, LVM, RAID, Stratis, NFS
|
||
Networking — интерфейсы, маршруты, firewall
|
||
Accounts — пользователи и группы
|
||
Software Updates — обновление пакетов
|
||
Terminal — встроенный терминал в браузере
|
||
Logs — journald логи с фильтрами
|
||
Podman — управление контейнерами
|
||
Machines — виртуальные машины (KVM/libvirt)`)
|
||
|
||
utils.Note("Cockpit работает в браузере, не требует постоянного подключения: сессия = одна вкладка.")
|
||
utils.Note("Порт 9090. Сертификат самоподписанный — нужно добавить исключение в браузере или подключить Let's Encrypt.")
|
||
|
||
// ─── 61. Глоббинг и регулярные выражения ─────────────────────
|
||
utils.Section("61. Глоббинг и регулярные выражения")
|
||
|
||
utils.Println(utils.ColorBold + "Глоббинг (Globbing) — шаблоны оболочки:" + utils.ColorReset)
|
||
utils.Code(`* — любое количество любых символов (кроме /)
|
||
? — ровно один любой символ
|
||
[abc] — один символ из набора
|
||
[a-z] — один символ из диапазона
|
||
[!abc] — один символ НЕ из набора
|
||
{a,b,c} — одно из перечисленных
|
||
|
||
# Примеры:
|
||
ls *.log # все файлы .log
|
||
ls file?.txt # file1.txt, fileA.txt...
|
||
ls [0-9]*.conf # начинающиеся с цифры
|
||
ls /etc/{nginx,apache}* # /etc/nginx* или /etc/apache*
|
||
rm backup_{2023,2024}*.tar # удалить бэкапы 2023 и 2024
|
||
cp /etc/*.{conf,cfg} /tmp/ # все .conf и .cfg
|
||
|
||
# Расширенный глоббинг (shopt -s extglob):
|
||
?(pattern) — 0 или 1 вхождение
|
||
*(pattern) — 0 или более
|
||
+(pattern) — 1 или более
|
||
@(pattern) — ровно 1
|
||
!(pattern) — всё кроме`)
|
||
|
||
utils.Println(utils.ColorBold + "Регулярные выражения — базовые (BRE):" + utils.ColorReset)
|
||
utils.Code(`. — любой символ
|
||
* — 0 или более предыдущего
|
||
^ — начало строки
|
||
$ — конец строки
|
||
[abc] — один символ из набора
|
||
[^abc] — один символ НЕ из набора
|
||
\(abc\) — группа
|
||
\{n,m\} — от n до m повторений
|
||
|
||
# Примеры:
|
||
grep '^root' /etc/passwd # строки начинающиеся с root
|
||
grep 'bash$' /etc/passwd # строки оканчивающиеся на bash
|
||
grep '^$' file.txt # пустые строки
|
||
grep '[0-9]\{3\}' file.txt # три цифры подряд`)
|
||
|
||
utils.Println(utils.ColorBold + "Регулярные выражения — расширенные (ERE):" + utils.ColorReset)
|
||
utils.Code(`+ — 1 или более предыдущего
|
||
? — 0 или 1 предыдущего
|
||
| — ИЛИ
|
||
(abc) — группа (без \)
|
||
{n,m} — от n до m повторений (без \)
|
||
|
||
# Использование ERE: grep -E, egrep, sed -E, awk
|
||
|
||
grep -E 'cat|dog' file.txt # cat или dog
|
||
grep -E '^[0-9]+\.' file.txt # строки начинающиеся с числа.
|
||
grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' file.txt # IPv4-адрес
|
||
grep -E 'error|warning|critical' /var/log/syslog
|
||
|
||
# Полезные классы символов:
|
||
[[:alpha:]] — буквы (a-z, A-Z)
|
||
[[:digit:]] — цифры (0-9)
|
||
[[:alnum:]] — буквы и цифры
|
||
[[:space:]] — пробельные символы
|
||
[[:upper:]] — заглавные буквы
|
||
[[:lower:]] — строчные буквы
|
||
[[:punct:]] — знаки препинания`)
|
||
|
||
utils.Println(utils.ColorBold + "grep — поиск по шаблону:" + utils.ColorReset)
|
||
utils.Command("grep 'pattern' file", "базовый поиск")
|
||
utils.Command("grep -i 'pattern' file", "без учёта регистра")
|
||
utils.Command("grep -v 'pattern' file", "строки НЕ совпадающие")
|
||
utils.Command("grep -n 'pattern' file", "с номерами строк")
|
||
utils.Command("grep -c 'pattern' file", "количество совпадений")
|
||
utils.Command("grep -l 'pattern' *.conf", "только имена файлов")
|
||
utils.Command("grep -r 'pattern' /etc/", "рекурсивно в директории")
|
||
utils.Command("grep -A 3 'pattern' file", "3 строки ПОСЛЕ совпадения")
|
||
utils.Command("grep -B 2 'pattern' file", "2 строки ДО совпадения")
|
||
utils.Command("grep -C 2 'pattern' file", "2 строки до и после")
|
||
utils.Command("grep -E 'pat1|pat2' file", "расширенные регулярки")
|
||
utils.Command("grep -P '\\d+' file", "Perl-совместимые regex")
|
||
utils.Command("grep -o 'pattern' file", "только совпадающая часть")
|
||
utils.Command("grep -w 'word' file", "только целые слова")
|
||
fmt.Println()
|
||
|
||
utils.Println(utils.ColorBold + "sed — потоковый редактор:" + utils.ColorReset)
|
||
utils.Code(`# Синтаксис: sed 'команда' файл
|
||
# -i — изменить файл на месте
|
||
# -E — расширенные регулярки
|
||
|
||
# Замена (s — substitute):
|
||
sed 's/old/new/' file # первое вхождение в каждой строке
|
||
sed 's/old/new/g' file # все вхождения (global)
|
||
sed 's/old/new/gi' file # без учёта регистра
|
||
sed 's/old/new/2' file # второе вхождение
|
||
|
||
# Разделитель можно менять (удобно для путей):
|
||
sed 's|/old/path|/new/path|g' file
|
||
sed 's#/etc#/conf#g' file
|
||
|
||
# Изменить файл на месте:
|
||
sed -i 's/old/new/g' file.conf
|
||
sed -i.bak 's/old/new/g' file.conf # сохранить бэкап .bak
|
||
|
||
# Удаление строк:
|
||
sed '/pattern/d' file # удалить строки с паттерном
|
||
sed '5d' file # удалить 5-ю строку
|
||
sed '2,10d' file # удалить строки 2-10
|
||
sed '/^$/d' file # удалить пустые строки
|
||
sed '/^#/d' file # удалить комментарии
|
||
|
||
# Вставка и добавление:
|
||
sed '3a новая строка' file # добавить после строки 3
|
||
sed '3i новая строка' file # вставить перед строкой 3
|
||
sed '$a последняя' file # добавить в конец
|
||
|
||
# Вывод конкретных строк:
|
||
sed -n '5,10p' file # напечатать строки 5-10
|
||
sed -n '/start/,/end/p' file # между паттернами
|
||
|
||
# Несколько команд:
|
||
sed -e 's/foo/bar/' -e 's/baz/qux/' file
|
||
sed 's/foo/bar/; s/baz/qux/' file
|
||
|
||
# Практические примеры:
|
||
# Удалить комментарии и пустые строки:
|
||
sed '/^#/d; /^$/d' nginx.conf
|
||
|
||
# Заменить IP во всех конфигах:
|
||
sed -i 's/192\.168\.1\.100/10\.0\.0\.1/g' /etc/nginx/*.conf
|
||
|
||
# Добавить строку после первого совпадения:
|
||
sed '/\[global\]/a log level = 2' /etc/samba/smb.conf`)
|
||
|
||
utils.Println(utils.ColorBold + "awk — обработка текста по полям:" + utils.ColorReset)
|
||
utils.Code(`# awk обрабатывает текст построчно, разбивая на поля.
|
||
# По умолчанию разделитель — пробел/таб.
|
||
|
||
# Поля: $1 $2 $3 ... $NF (последнее), $0 (вся строка)
|
||
# NF — количество полей, NR — номер строки
|
||
|
||
# Вывод конкретного поля:
|
||
awk '{print $1}' file # первое поле
|
||
awk '{print $1, $3}' file # первое и третье
|
||
awk '{print NR, $0}' file # с номерами строк
|
||
|
||
# Другой разделитель (-F):
|
||
awk -F: '{print $1}' /etc/passwd # имена пользователей
|
||
awk -F: '{print $1, $6}' /etc/passwd # имя и домашняя директория
|
||
awk -F, '{print $2}' data.csv # второй столбец CSV
|
||
|
||
# Условия:
|
||
awk '$3 > 1000' file # строки где 3-е поле > 1000
|
||
awk '/pattern/ {print $0}' file # строки с паттерном
|
||
awk '$1 == "root"' /etc/passwd # строки где $1 = "root"
|
||
|
||
# Вычисления:
|
||
awk '{sum += $1} END {print sum}' file # сумма первого столбца
|
||
awk 'END {print NR}' file # количество строк (= wc -l)
|
||
|
||
# BEGIN и END блоки:
|
||
awk 'BEGIN {print "Начало"} {print $1} END {print "Конец"}' file
|
||
|
||
# Переменные и форматирование:
|
||
awk -F: '{printf "%-20s %s\n", $1, $6}' /etc/passwd
|
||
|
||
# Практические примеры:
|
||
# Топ процессов по CPU:
|
||
ps aux | awk 'NR>1 {print $3, $11}' | sort -rn | head -10
|
||
|
||
# Сумма размеров файлов (ls -l):
|
||
ls -l | awk '{sum += $5} END {print sum " bytes"}'
|
||
|
||
# Уникальные IP из лога nginx:
|
||
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
|
||
|
||
# Обработка CSV:
|
||
awk -F, 'NR>1 && $3 > 100 {print $1, $2}' report.csv`)
|
||
|
||
utils.Footer()
|
||
}
|