Linux Skill - Освой Linux c нуля до DevOps
11.3K subscribers
56 photos
100 videos
481 links
Освой Linux c нуля до DevOps
Подробный гайд по Linux и море других уроков для системных администраторов

📩 По всем вопросам: @chorapov

РКН https://vk.cc/cMUwm4
Download Telegram
🚨 НИКОГДА не редактируй bash-скрипт во время его выполнения!

Привет, повелитель терминала! 👋

Знаешь, что может превратить безобидный скрипт в оружие массового уничтожения данных? Всего одно неосторожное редактирование.

💣 Смотри, какая бомба:


#!/bin/bash
sleep 30
#rm -rf --no-preserve-root /
echo "Time's up!"


Выглядит безопасно? Команда rm закомментирована, скрипт просто ждёт 30 секунд. Но стоит тебе отредактировать его во время выполнения...

Что происходит:
1. Запускаешь скрипт → bash начинает читать его частями
2. Меняешь sleep 30 на sleep 3 в редакторе
3. Сохраняешь файл → смещение байтов сбивается
4. BOOM! → bash читает rm -rf / вместо комментария

🔍 Доказательство через strace:


# Открытие скрипта
openat(AT_FDCWD, "delay.sh", O_RDONLY) = 3

# Парсинг первой строчки (до 80 символов)
read(3, "#!/bin/bash\nsleep 30\n#echo \"Don'"..., 80) = 64

# Возврат к началу
lseek(3, 0, SEEK_SET) = 0

# Переключение на на файловый дескриптор 255
dup2(3, 255) = 255

# Чтение 64-байтового куска файла, чтобы получить команду
read(255, "#!/bin/bash\nsleep 30\n#echo \"Don'"..., 64) = 64

# Поместить курсор обратно в конец команды, которую мы собираемся выполнить
# Offset 21 is the `#`
lseek(255, -43, SEEK_CUR) = 21

# Приостановка выполнения, уход в sleep
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 2072

# До возвращения wait4 файл редактируется с `30` на `3`

# Чтение 64-байтового куска файла, чтобы получить следующую команду
# В этом демо я заменил опасную команду на echo
read(255, "echo \"Don't execute me\"\necho \"Ti"..., 64) = 42

# Bash решает выполнить оба echo одновременно без нового чтения
# Очевидно, что-то идёт не так
write(1, "Don't execute me\n", 17) = 17
write(1, "Time's up!\n", 11) = 11

# Чтение следующего фрагмента и обнаружение конца файла
read(255, "", 64) = 0


🛡️ Как защититься:
Копируй скрипт перед редактированием
Останови выполнение перед правками
Используй блокировки файлов
Тестируй на копиях важных скриптов

💡 Вывод
Bash читает скрипт блоками по 64 байта и отслеживает позицию. Удаление символов сдвигает содержимое, но не позицию чтения!

🌐 Источник: https://habr.com/ru/articles/500832/
________________

Дополнительный материал:
🧠 - GRUB Files Unveiled: Путеводитель по конфигурационным файлам
🧠 - Как настроить автоматическое включение вашего компьютера с помощью RTC
🧠 - GRUB Rescue Ops: Как оживить систему, замершую на grub>

#Linux_Mastery #Linux #Bash #Security #DevOps #SysAdmin #ScriptSafety
👍24
🔐 Забыл заблокировать ПК? Твой телефон сделает это за тебя

Привет, мастер безопасности!

Знакомо? Отошёл за кофе, а коллега уже изучает твой браузер. Сейчас покажу, как превратить твой смартфон в умный ключ — Linux будет автоматически блокироваться, когда ты уходишь.

📌 Что понадобится:
- Bluetooth на компе и телефоне
- 5 минут времени
- Bash-скрипт ниже

🔧 Настройка за 3 шага:

1. Найди MAC-адрес телефона:
# Включи Bluetooth на телефоне и запусти
hcitool scan


2. Создай скрипт автоблокировки:
#!/bin/bash
# MAC-адрес твоего телефона
DEVICE="AA:BB:CC:DD:EE:FF"
# Имя устройства из hcitool scan
DEV_NAME="My Phone"
# Интервал проверки (сек)
INTERVAL=5

# PID xscreensaver
XSS_PID=

# Запускаем xscreensaver, если не запущен
pgrep xscreensaver
if [ $? -eq 1 ]; then
echo "Starting xscreensaver..."
xscreensaver &
fi

# Основной цикл проверки
while [ 1 ]; do
opt=$(hcitool name $DEVICE)
if [ "$opt" = "$DEV_NAME" ]; then
echo "Device '$opt' found"
if [ -n "$XSS_PID" ]; then
echo "Killing $XSS_PID"
kill $XSS_PID
XSS_PID=
fi
else
echo "Can't find device $DEVICE ($DEV_NAME); locking!"
xscreensaver-command -lock
XSS_PID=$!
fi
sleep $INTERVAL
done


3. Запусти и забудь:
chmod +x bluetooth-lock.sh
./bluetooth-lock.sh &


💡 Как это работает:
Скрипт каждые 5 секунд проверяет, видит ли компьютер твой телефон по Bluetooth. Ушёл дальше 10 метров — экран автоматически блокируется. Вернулся — всё как было.

____________________

Дополнительный материал:
🧠 - GRUB Boot Mastery: Изучаем искусство восстановления
🧠 - Как настроить ночное выключение вашего компьютера с помощью cron
🧠 - GRUB Makeover: Как дать новую жизнь конфигурации загрузчика

#Linux_Mastery #Linux #Security #Bash #Bluetooth #Desktop #Automation
👍23🔥10👀1
🔥 HTTPS в локалке: от красного замка к зелёному за 10 команд

Привет, укротитель сертификатов!

Браузер постоянно ругается на самоподписанный сертификат? Надоело кликать "Продолжить несмотря на риск"? Создаём свой CA (Certificate Authority - центр сертификации) и забываем про предупреждения навсегда!

🔧 Создаём свой CA:
# mkdir ~/tls && cd ~/tls
# openssl ecparam -out myCA.key -name prime256v1 -genkey
# openssl req -x509 -new -nodes -key myCA.key -sha256 -days 9999 -out myCA.crt


📝 Генерируем сертификат для сервера:
# openssl genrsa -out zabbix.internal.key 2048
# openssl req -new -key zabbix.internal.key -out zabbix.internal.csr


⚙️ Конфиг с альтернативными именами:
# mcedit zabbix.internal.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
IP.1 = 172.30.245.222
DNS.1 = zabbix.internal


🚀 Подписываем сертификат:
# openssl x509 -req -in zabbix.internal.csr -CA myCA.crt -CAkey myCA.key \
-CAcreateserial -out zabbix.internal.crt -days 9999 -sha256 -extfile zabbix.internal.ext


🔧 Настройка Nginx:
# mkdir /etc/nginx/certs
# cp zabbix.internal.crt /etc/nginx/certs/.
# cp zabbix.internal.key /etc/nginx/certs/.
# openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048


listen     443 http2 ssl;
server_name zabbix.internal 172.30.245.222;
ssl_certificate /etc/nginx/certs/zabbix.internal.crt;
ssl_certificate_key /etc/nginx/certs/zabbix.internal.key;
ssl_dhparam /etc/ssl/certs/dhparam.pem;


💡 Финальный штрих:
Добавь myCA.crt в доверенные корневые сертификаты на клиенте. Всё! Зелёный замок на 27 лет!
____________________

Дополнительный материал:
🧠 - Настройка Ctrl+Alt+Delete в Linux: Перезагрузка или Выключение?
🧠 - GRUB's Got Talent": За кулисами самотестирования компьютера
🧠 - Linux на ночь: Как уложить систему спать с помощью systemctl

#Linux_Mastery #ssl #nginx #https #certificates #Linux #security
👍21
💥 Забудь про медленный SCP: NFS-сервер одной командой

Привет, скоростной гонщик!

Копируешь терабайты через SCP и ждёшь часами? NFS быстрее в разы! Держи готовую инструкцию для копипаста — настройка временной шары за 5 минут.

🖥️ На сервере:

Подготовка:

# mkdir /mnt/nfs
# chown nobody:nogroup /mnt/nfs
# apt install nfs-kernel-server


Настройка экспорта:

# nano /etc/exports
# Для одного IP:
/mnt/nfs 10.20.1.56(rw,all_squash,no_subtree_check,crossmnt)

# Для подсети:
/mnt/nfs 10.20.1.56/24(rw,all_squash,no_subtree_check,crossmnt)

# Для нескольких IP:
/mnt/nfs 10.20.1.56(rw,all_squash,no_subtree_check,crossmnt)
/mnt/nfs 10.20.1.52(rw,all_squash,no_subtree_check,crossmnt)


Запуск:

# systemctl restart nfs-server


💻 На клиенте:


# apt install nfs-common

# Проверка доступности:
# showmount -e 10.20.1.36

# Монтирование:
# mkdir /mnt/nfs
# mount 10.20.1.36:/mnt/nfs /mnt/nfs

# Проверка версии (должна быть v4):
# mount -t nfs4


🚀 Автомонтирование:

# echo "10.20.1.36:/mnt/nfs /mnt/nfs nfs4 defaults 0 0" >> /etc/fstab


💡 Порт 2049/tcp должен быть открыт!

Теперь копирование файлов летает! По скорости: NFS > HTTP > SMB > SSH > SCP.

________________

Дополнительный материал:
🧠 - Временная спираль Linux: От SysV к Systemd
🧠 - GRUB Rescue Mission: Как восстановить систему из grub rescue>
🧠 - Systemd для начинающих: Первые шаги к мастерству в Linux

#Linux_Mastery #nfs #network #storage #Linux #performance #filesharing
👍16
🎯 Nginx выдаёт домены по IP? Решение, которое работает

Привет, страж безопасности!

Заметил, что при обращении к серверу по IP адресу Nginx показывает первый попавшийся сайт? Это палит все твои виртуальные хосты. Сейчас покажу элегантное решение, о котором знают немногие.

📌 Стандартная заглушка для HTTP:
server {
listen 80 default_server;
server_name _;
return 404;
}


С HTTP всё просто. А вот с HTTPS начинаются танцы с бубном...

🔧 Проблема HTTPS:
Без сертификата Nginx использует сертификат первого виртуального хоста. Пользователь видит:
- Предупреждение о несоответствии домена
- Реальное имя твоего сайта в сертификате 😱

💭 Старое решение — сертификат-пустышка:
# Генерируем самоподписанный сертификат
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout /etc/nginx/certs/nginx.key \
-out /etc/nginx/certs/nginx.crt


server {
listen 443 ssl default_server;
server_name _;
ssl_certificate /etc/nginx/certs/nginx.crt;
ssl_certificate_key /etc/nginx/certs/nginx.key;
return 404;
}


Домены скрыты, но предупреждение о сертификате остаётся...

🚀 Новое решение — ssl_reject_handshake:
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
ssl_reject_handshake on;
return 404;
}


💡 Что происходит:
ssl_reject_handshake on отклоняет SSL-соединение на уровне handshake, если запрос не соответствует server_name. Результат:
- Никаких предупреждений о сертификатах
- Мгновенная ошибка соединения
- Полная анонимность виртуальных хостов

Теперь любопытные не узнают, какие сайты крутятся на твоём сервере!
____________________

Дополнительный материал:
🧠 - Linux для продвинутых: Как проверить, использует ли ваша система systemd?
🧠 - Linux Deep Dive: PID 1 и его детище - systemd
🧠 - Linux Command Mastery: Управление службами с помощью systemd

#Linux_Mastery #nginx #webserver #security #ssl #DevOps #angie
👍19👀4
15 строк кода = полный контроль над производительностью

Эй, повелитель серверов!

Надоело переключаться между htop, df и free? Сейчас соберём свой монитор системы, который покажет всё важное одной командой. Bash + Python = твоя личная панель управления.

📌 Что получишь:
- CPU, RAM и диск в одном месте
- JSON-формат для интеграции
- Легко расширить под свои нужды

🔧 Шаг 1: Python-сборщик данных

Создай monitor.py:
import psutil
import json

def get_system_stats():
stats = {
"cpu": psutil.cpu_percent(interval=1),
"memory": psutil.virtual_memory().percent,
"disk": psutil.disk_usage('/').percent
}
return json.dumps(stats)

if __name__ == "__main__":
print(get_system_stats())


🔧 Шаг 2: Bash-обработчик

Создай monitor.sh:
#!/bin/bash
# Получаем данные от Python
stats=$(python3 monitor.py)

# Парсим JSON через jq
cpu=$(echo $stats | jq -r '.cpu')
memory=$(echo $stats | jq -r '.memory')
disk=$(echo $stats | jq -r '.disk')

# Красивый вывод
echo "CPU Usage: $cpu%"
echo "Memory Usage: $memory%"
echo "Disk Usage: $disk%"


🚀 Запускаем:
# Делаем исполняемым
chmod +x monitor.sh

# Смотрим магию
./monitor.sh


Результат:
CPU Usage: 12.3%
Memory Usage: 45.6%
Disk Usage: 67.8%


💡 Прокачай скрипт:
- Добавь алерты при превышении порогов
- Логируй данные для графиков
- Отправляй метрики в Telegram при критических значениях

Теперь один скрипт заменяет кучу утилит. А главное — ты можешь допилить его под свои задачи!
____________________

Дополнительный материал:
🧠 - Мастер-класс по выключению и перезагрузке Linux с помощью команды shutdown
🧠 - Прозрачность systemd: Освещаем теневые уголки системных процессов в Linux
🧠 - Управление питанием в Linux: Искусство выключения с помощью systemctl

#Linux_Mastery #Linux #Monitoring #Python #Bash #DevOps #Performance
🔥8👍6
🔥 SSH забивает вывод? Вот как отладить сеть через tcpdump

Привет, сетевой детектив!

Знакомо? Запускаешь tcpdump для отладки, а SSH-трафик забивает весь экран. Сейчас покажу мою шпаргалку — только те команды, которые реально использую. Без воды, только практика.

📌 С чего начать:

Список интерфейсов:
# Посмотреть доступные интерфейсы
tcpdump -D


Базовый перехват:
# Все интерфейсы без резолва имён (-nn это важно!)
tcpdump -nn -i any

# Конкретный интерфейс
tcpdump -nn -i ens3


🔧 Главный лайфхак — исключаем SSH:
# SSH забивает вывод? Исключаем порт 22
tcpdump -nn -i any port not 22


📡 Фильтруем по адресам:
# Трафик к конкретному адресу
tcpdump -nn dst 8.8.8.8

# К нескольким адресам
tcpdump -nn dst 8.8.8.8 or dst 8.8.4.4

# Комбо: адрес + порт
tcpdump -nn dst 8.8.8.8 and port 53


🎯 Работа с протоколами:
# Только ARP
tcpdump arp -nn -i any

# Всё, кроме ARP
tcpdump not arp -nn -i any

# Исключаем несколько протоколов
tcpdump not arp and not icmp -nn -i any


💡 Реальный пример из жизни:
Отладка SIP-трафика через VPN:
tcpdump -nn -i tun4 src 10.1.4.23 and dst 10.1.3.205 and port 5060


🚀 Про-совет:
Большой поток? Сохраняй в файл:
tcpdump -nn -i any > ~/tcpdump.txt


Что искать в выводе:
IP 10.8.2.2.13083 > 10.8.2.3.8118

Читается: IP источник.порт > получатель.порт

Вот и всё! Этих команд хватает для 90% задач. tcpdump выглядит страшно, но на деле нужно только видеть, откуда и куда идут пакеты.
____________________

Дополнительный материал:
🧠 - Linux Systemd: Искусство мониторинга служб
🧠 - Linux Systemd: Мастер-класс по управлению службами
🧠 - Linux Systemd: Как стать магистром служб


#Linux_Mastery #network #tcpdump #Linux #DevOps #networking #debug
👍22👎1
🔥 20 Docker-команд = 90% всех задач. Проверено!

Эй, контейнерный кудесник!

Накопил за годы работы идеальный набор Docker-команд. Никакой воды — только то, что использую каждый день. Сохраняй и забудь про поиски в документации!

🚀 Быстрый старт:
# Установка одной строкой
curl -o - https://get.docker.com | bash -


📦 Управление контейнерами:

Запуск с автостартом:
docker run -d -p 80:80 --restart always --name nginx-proxy nginx


Просмотр контейнеров:
docker ps          # запущенные
docker ps -a # все


Удаление:
docker rm nginx-proxy      # остановленный
docker rm -f nginx-proxy # принудительно


Массовые операции:
# Остановить все
docker stop $(docker ps -a -q)
# Удалить все
docker rm $(docker ps -a -q)


🖼️ Работа с образами:
docker images                      # список
docker rmi nginx # удалить один
docker rmi $(docker images -a -q) # удалить все


🔍 Отладка и мониторинг:

Войти в контейнер:
docker exec -it nginx-proxy bash


Логи:
docker logs nginx-proxy         # все логи
docker logs -n 100 nginx-proxy # последние 100 строк
docker logs -f nginx-proxy # следить в реальном времени


Мониторинг ресурсов:
docker stats nginx-proxy
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"


Процессы в контейнере:
docker top nginx-proxy


🛠️ Продвинутые команды:

Детальная информация:
docker inspect nginx-proxy
docker inspect -f '{{ .NetworkSettings.Networks.bridge.IPAddress }}' nginx-proxy
docker inspect --format '{{json .Mounts}}' grafana | jq .


Управление местом:
docker system df      # занятое место
docker system prune # очистка


Копирование файлов:
# Из контейнера
docker cp nginx-proxy:/etc/nginx/nginx.conf ~/nginx
# В контейнер
docker cp ~/nginx/nginx.conf nginx-proxy:/etc/nginx


Экспорт контейнера:
docker export nginx-proxy -o ~/nginx-proxy.tar.gz


📚 Бонус — полезные темы:
🔧 Инструменты: Portainer, ctop, cdebug
🛡️ Безопасность: Trivy, Dockle, CIS рекомендации
📊 Мониторинг: Zabbix, Prometheus
🗃️ Бэкапы: docker-volume-backup

Теперь у тебя есть всё для работы с Docker. Эти команды покрывают 90% повседневных задач!
____________________

Дополнительный материал:
🧠 - Открытый мир Linux: Сокровищница инструментов для системных администраторов
🧠 - Стартуйте в IT с Бесплатным курсом по Linux: от Нуля до DevOps
🧠 - От /etc/passwd к централизованному управлению: Как Linux трансформировал учетные записи

#Linux_Mastery #docker #DevOps #containers #Linux #подборка #automation
👍12
💾 Невидимые файлы съели весь диск? Вот решение

Привет, спасатель серверов!

Знакомо: df кричит "100% занято", а найти виновника не можешь? Держи шпаргалку для экстренных ситуаций — все команды проверены в боевых условиях.

Базовая диагностика

Смотрим общую картину:
# df -h


Ищем самые прожорливые директории:
# du -h -d 1 / | sort -hr
# du -hs /* | sort -hr

# Ограничиваем вывод топ-10
# du -h -d 1 / | sort -hr | head -10

# Топ-20 самых больших директорий
# du -hcx --max-depth=6 / | sort -rh | head -n 20

# Топ-20 самых больших файлов
# find / -mount -ignore_readdir_race -type f -exec du -h "{}" + 2>&1 \
> | sort -rh | head -n 20


Проверка inodes

Иногда место есть, но закончились inodes:
# df -ih


Охота на файлы-призраки

Ситуация: du показывает мало занятого места, но df говорит "диск полный". Причина — удалённые файлы, которые держит процесс:

# lsof | grep '(deleted)'
# lsof +L1


Нашли большие deleted-файлы? Перезапусти службу или убей процесс через kill -9 <pid>.

Ловушка с точками монтирования

Хитрый случай: скрипт должен был писать в смонтированный диск /mnt/backup, но диск не подключился. Файлы записались в локальную систему и теперь скрыты под точкой монтирования!

Как проверить:
1. Отмонтируй диск временно
2. Загляни в директорию
3. Удали мусор
4. Примонтируй обратно

Профилактика: всегда проверяй успешность монтирования перед записью данных в скриптах.

💡 Итог: 90% проблем с местом решаются этими командами. Сохрани и используй при первых признаках "disk full".

____________________

Дополнительный материал:
🧠 - Осваиваем RAID Массивы в Linux: Путь к Надежности и Производительности
🧠 - История OpenSUSE: От Зеленого Ящерика к Глобальному Сообществу
🧠 - Разблокируем секреты Linux: Специальные разрешения файлов

#Linux_Mastery #bash #terminal #linux #sysadmin #troubleshooting #storage
🔥12👍8
🚀 Забудь про SCP! Вот как передавать файлы в 10 раз быстрее

Привет, повелитель скорости!

Устал ждать, пока SCP докачает твои гигабайты? NFS обгоняет SSH, SMB и HTTP по скорости передачи. Вот готовая шпаргалка — копипасть и используй.

Настройка NFS сервера

Создаём директорию для шары:
# mkdir /mnt/nfs
# chown nobody:nogroup /mnt/nfs


Ставим NFS сервер:
# apt install nfs-kernel-server


Настраиваем экспорт в /etc/exports:
# Для одного IP
/mnt/nfs 10.20.1.56(rw,all_squash,no_subtree_check,crossmnt)

# Для подсети
/mnt/nfs 10.20.1.56/24(rw,all_squash,no_subtree_check,crossmnt)

# Для нескольких IP (каждый в своей строке)
/mnt/nfs 10.20.1.56(rw,all_squash,no_subtree_check,crossmnt)
/mnt/nfs 10.20.1.52(rw,all_squash,no_subtree_check,crossmnt)


Перезапускаем и проверяем:
# systemctl restart nfs-server
# systemctl status nfs-server


💡 Важно: открой TCP порт 2049 в файрволе!

Настройка клиента

Ставим клиентский пакет:
# apt install nfs-common


Проверяем доступность сервера:
# showmount -e 10.20.1.36
Export list for 10.20.1.36:
/mnt/nfs 10.20.1.56


Монтируем шару:
# mkdir /mnt/nfs
# mount 10.20.1.36:/mnt/nfs /mnt/nfs


Проверяем результат:
# df -h | grep nfs
10.20.1.36:/mnt/nfs 48G 3.2G 43G 7% /mnt/nfs

# Смотрим версию протокола (должна быть v4)
# mount -t nfs4


Тестируем запись:
# echo "test" > /mnt/nfs/testfile


Для постоянного монтирования добавь в /etc/fstab:
10.20.1.36:/mnt/nfs /mnt/nfs nfs4 defaults 0 0


Результат: максимальная скорость передачи файлов между серверами. Особенно выручает для временных задач — поднял, скопировал, удалил.

____________________

Дополнительный материал:
🧠 - Путешествие во Времени: От ext до ext4 - Эволюция Файловых Систем Linux
🧠 - Linux Mastery: Организация файлов и каталогов
🧠 - Как пентестеры взломали ИТ-компанию через сайт уролога и Роскомнадзор

#Linux_Mastery #fileserver #nfs #linux #sysadmin #devops #performance
👍12
🎯 Почему твой Nmap работает медленно: трюки ускорения

Эй, сканер сетей!

Устал ждать, пока Nmap просканирует сеть? Я тоже постоянно забываю нужные ключи и лезу в заметки. Собрал рабочую шпаргалку с трюками ускорения — сохраняй и используй.

Базовое сканирование

Быстрый скан портов до 1024:
nmap 192.168.1.1
nmap 192.168.1.1 192.168.2.1
nmap 192.168.1.1-254
nmap 192.168.1.0/24


Полное сканирование всех 65535 портов:
nmap 192.168.1.1 -p-


Скан хоста, игнорирующего ping:
nmap 192.168.1.1 -Pn


Техники сканирования

nmap 192.168.1.1 -sS  # TCP SYN (по умолчанию)
nmap 192.168.1.1 -sT # TCP connect
nmap 192.168.1.1 -sU # UDP сканирование

# Полное TCP+UDP (очень долго!)
nmap 192.168.1.1 -sS -sU -p-


Поиск живых хостов

Обнаружение без сканирования портов:
nmap 192.168.1.1/24 -sn


ARP-сканирование в локалке (в разы быстрее!):
nmap 192.168.1.1/24 -PR


Просто список IP без проверки:
nmap 192.168.1.1-15 -sL


Определение сервисов

Быстрая проверка версий (1 порт = 1 строка):
nmap 192.168.1.1 -sV


Полный анализ (ОС, версии, скрипты, traceroute):
nmap 192.168.1.1 -A


🚀 Трюк для ускорения в 10 раз

Вместо долгого полного сканирования — сначала найди открытые порты, потом анализируй только их:

#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1


Использование:
./nmap.sh 192.168.1.1


Скорость сканирования

-T0  # paranoid (паранойдный)
-T1 # sneaky (хитрый)
-T2 # polite (вежливый)
-T3 # normal (обычный, по умолчанию)
-T4 # aggressive (для локалки)
-T5 # insane (безумный)


💡 Совет: в локальной сети смело используй -T4, для внешних хостов — -T3 или ниже.

Итог: правильные ключи = экономия времени. Особенно скрипт с двухэтапным сканированием — реально ускоряет работу в разы.
____________________

Дополнительный материал:
🧠 - Путешествие по Виртуальным Интерфейсам и Канальному Уровню в Linux: От Туннелей до Мостов
🧠 - История AppArmor: Как Linux Стал Крепостью Безопасности
🧠 - Linux Mastery: Быстрое создание пакетов файлов для тестирования

#Linux_Mastery #nmap #security #pentesting #networking #linux
👍15🔥3
📊 Мониторинг без боли: Prometheus + Grafana одной командой

Привет, строитель мониторинга!

Prometheus проще Zabbix'а в разы — никаких агентов, баз данных, сложных конфигов. 10 минут и у тебя работающий мониторинг с красивыми графиками. Держи готовую шпаргалку.

Установка Docker

# curl https://get.docker.com | bash -


Подготовка файлов

# mkdir ~/prometheus && cd ~/prometheus
# touch docker-compose.yml


Docker-compose конфиг

Создай файл docker-compose.yml:
version: '3.9'
networks:
monitoring:
driver: bridge
volumes:
prometheus_data: {}

services:

prometheus:
image: prom/prometheus:latest
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
container_name: prometheus
hostname: prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
expose:
- 9090
restart: unless-stopped
environment:
TZ: "Europe/Moscow"
networks:
- monitoring

node-exporter:
image: prom/node-exporter
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
container_name: exporter
hostname: exporter
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
expose:
- 9100
restart: unless-stopped
environment:
TZ: "Europe/Moscow"
networks:
- monitoring

grafana:
image: grafana/grafana
user: root
depends_on:
- prometheus
ports:
- 3000:3000
volumes:
- ./grafana:/var/lib/grafana
- ./grafana/provisioning/:/etc/grafana/provisioning/
container_name: grafana
hostname: grafana
restart: unless-stopped
environment:
TZ: "Europe/Moscow"
networks:
- monitoring


Конфиг Prometheus

Создай файл prometheus.yml:
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
scrape_timeout: 5s
static_configs:
- targets: ['localhost:9090']

- job_name: 'node-local'
scrape_interval: 5s
static_configs:
- targets: ['node-exporter:9100']


Запуск всего стека

# docker-compose up -d


Настройка Grafana

1. Открой https://твой-ip:3000
2. Логин: admin / admin
3. Connections → Data sources → Add Prometheus
4. URL: https://prometheus:9090
5. Dashboards → New → Import
6. Введи ID: 1860 (готовый дашборд для Node Exporter)

Добавление удалённого сервера

На удалённом сервере запусти exporter:
# docker run -d --net="host" --pid="host" -v "/:/host:ro,rslave" \
prom/node-exporter:latest --path.rootfs=/host

# Проверка
# ss -tulnp | grep 9100


Добавь в prometheus.yml:
 - job_name: 'node-remote'
scrape_interval: 5s
static_configs:
- targets: ['10.20.1.56:9100']


Перезапусти:
# docker compose restart


💡 Результат: полноценный мониторинг с графиками CPU, RAM, диска, сети. Всё за 10 минут без танцев с бубном!

❗️ Важно: в проде закрой порты файрволом — оставь доступ только нужным IP.
____________________

Дополнительный материал:
🧠 - Мастерство Управления Правами в Linux: От Новичка до Профи
🧠 - Максимизируйте безопасность с минимальными разрешениями в Linux
🧠 - От Slackware до Pacman: Путешествие Систем Управления Пакетами в Linux

#Linux_Mastery #мониторинг #prometheus #devops #grafana #docker
👍10🔥3
🐳 Почему ты не можешь просто скопировать файл из Docker образа

Привет, укротитель контейнеров!

Знакомая боль: нужен один файл из Docker образа, но запускать контейнер не хочется. Docker почему-то не даёт простого решения. Рассказываю рабочий способ и показываю инструмент для анализа образов.

Извлекаем файл из образа

Скачиваем образ и создаём контейнер БЕЗ запуска:
# docker pull nginx:latest
# docker create --name nginx nginx:latest


Теперь копируем нужный файл:
# docker cp nginx:/docker-entrypoint.d/30-tune-worker-processes.sh ~/


Или выгружаем весь образ:
# docker export nginx -o ~/nginx-docker.tar.gz


Dive — рентген для образов

Утилита показывает слои образа и что в каждом слое изменилось. Запускаем прямо в Docker:

# docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock \
wagoodman/dive nginx:latest


Создаём alias для удобства:
alias dive="docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock wagoodman/dive"


Теперь просто:
# dive nginx:latest


Проверка раздутости образа

Вместо docker build используй dive build — получишь анализ эффективности сборки:
# dive build -t myapp:latest .


Dive покажет:
- Размер каждого слоя
- Что добавилось/удалилось
- Efficiency Score образа
- Wasted Space (лишнее место)

💡 Фишка: встрой проверку в CI/CD — автоматически отлавливай неоптимальные образы.

Итог: Docker создан для изоляции, поэтому прямого доступа к файлам нет. Но способы есть — используй их правильно.
____________________

Дополнительный материал:
🧠 - Linux Essentials: Понимание относительных и абсолютных путей к файлам
🧠 - Открытие Rancher: Путешествие от Стартапа до Лидера в Контейнеризации
🧠 - Осваиваем Docker: Искусство Сборки Образов и Управления Сетью

#Linux_Mastery #docker #devops #containers #optimization
👍15
🔐 Забудь про Nginx для тестов: вот решение проще

Эй, мастер быстрых решений!

Знаешь трюк с HTTP сервером на Python для передачи файлов? А что если нужен HTTPS для тестов, но лень возиться с Nginx? Показываю способ поднять защищённый сервер за минуту.

Классика для HTTP

# python3 -m http.server 8000


## Апгрейд до HTTPS

Генерируем самоподписный сертификат:
# openssl req -new -x509 -keyout localhost.pem -out localhost.pem -days 365 -nodes


Создаём файл webserver.py:
import http.server, ssl

server_address = ('172.20.0.210', 8000)
httpd = http.server.HTTPServer(server_address, http.server.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(httpd.socket,server_side=True,certfile='localhost.pem',ssl_version=ssl.PROTOCOL_TLSv1_2)
httpd.serve_forever()


Запускаем HTTPS сервер:
# python3 webserver.py


Проверяем:
# Открываем в браузере
https://172.20.0.210:8000


Что получаем:
- Полноценный HTTPS сервер для тестов
- Файловый браузер по умолчанию
- Или веб-страница, если есть index.html
- Никаких конфигов и лишней возни

💡 Где пригодится:
- Тестирование приложений, требующих HTTPS
- Быстрая передача файлов по защищённому каналу
- Временный сервер для демо
- Проверка SSL/TLS настроек

Совет: сохрани скрипт в /usr/local/bin/ и используй как команду для быстрого запуска HTTPS где угодно.
____________________

Дополнительный материал:
🧠 - Открываем тайны Linux: Почему скрыть файлы от пользователя root невозможно?
🧠 - Как Создать Идеальный Dockerfile: Секреты Эффективности и Лаконичности
🧠 - Ускоряем YouTube и обходим блокировки на Linux: Ваше руководство

#Linux_Mastery #webserver #python #https #quickfix #sysadmin
👍14🔥3
🔍 Как объединить логи всех контейнеров в одном месте

Привет, укротитель логов!

Вчера в комментах подсказали инструмент logdy — теперь смотрю все логи через браузер. Один бинарник, никаких зависимостей. Показываю все режимы работы.

Установка за 10 секунд

# curl https://logdy.dev/install.sh | sh


## Простой режим — один лог

# tail -f /var/log/syslog | logdy --ui-ip=0.0.0.0


Или так:
# logdy --ui-ip=0.0.0.0 follow /var/log/syslog


Открывай https://твой-ip:8080 — логи в браузере!

Логи Docker контейнера

# docker logs 761965fa13b2 --follow | logdy --ui-ip=0.0.0.0


Объединение нескольких контейнеров

Запускаем logdy в режиме сокетов:
# logdy --ui-ip=0.0.0.0 socket 8123 8124


Направляем логи каждого контейнера:
# docker logs d20339949095 --follow | logdy forward 8123
# docker logs 761965fa13b2 --follow | logdy forward 8124


Теперь все логи в одном интерфейсе с фильтрацией по источнику!

Для локальной разработки

# node app.js | logdy


В VS Code: Ctrl+Shift+P → "Simple Browser: Show" → https://localhost:8080

API режим с токеном

Запускаем с API:
# logdy --ui-ip=0.0.0.0 --api-key=secrettoken


Отправляем логи через curl:
curl --location --request POST 'https://1.2.3.4:8080/api/log' \
--header 'Authorization: Bearer secrettoken' \
--header 'Content-Type: application/json' \
--data '{"logs": [{"log": "this is a log message as a string" }],"source":"machine identifier"}'


Режим stdin для пайпов

# logdy stdin


Фишки logdy:
- Парсит JSON логи автоматически
- Разбивает на колонки
- Фильтрация и поиск в реальном времени
- Защита паролем через ключи запуска
- Экспорт логов

💡 Где выручает:
- Отладка микросервисов
- Мониторинг нескольких контейнеров
- Быстрый просмотр логов без SSH
- Демо для заказчика

Итог: один инструмент покрывает 90% задач с логами. Особенно круто для Docker-окружения.
____________________

Дополнительный материал:
🧠 - Путешествие LXD: Как Контейнеры LXD Переопределили Виртуализацию
🧠 - Удаление файлов и каталогов без стресса
🧠 - Создание Docker Образов и Магия Сетей: От Одиночных Узлов до Docker Swarm

#Linux_Mastery #logs #devops #docker #monitoring #tools
👍9🔥7
🔧 История команд исчезает? Вот решение

Привет, хранитель команд!

Бесит, когда нужная команда не сохранилась в history? На всех своих серверах первым делом настраиваю правильное хранение истории. Делюсь проверенными настройками для ~/.bashrc.

Мгновенное сохранение команд

PROMPT_COMMAND='history -a'

Команда сохраняется сразу после ввода, а не при выходе из сессии.

Метки времени для команд

export HISTTIMEFORMAT='%F %T '

Теперь видно когда выполнялась команда: 2024-09-25 16:39:30

Увеличение размера истории

export HISTSIZE=10000

Вместо дефолтных 500 команд — храним 10000. Хватает с запасом.

Исключение мусорных команд

export HISTIGNORE="ls:history:w:htop:pwd:top:iftop"

Эти команды не засоряют историю.

Пробел = команда не сохраняется

export HISTCONTROL=ignorespace

Поставил пробел перед командой — она не попадёт в историю.

Применение настроек

# source ~/.bashrc


Проверка параметров

# export | grep -i hist


Для всех пользователей

Создай файл /etc/profile.d/history.sh с этими настройками — применится для всех.

Поиск по истории

Быстрый поиск: Ctrl+R и начинай вводить команду. Повторное Ctrl+R — следующее совпадение.

Мой способ через grep:
# history | grep 'apt install'


⚠️ Опасный подвох HISTIGNORE

История из жизни: htop в исключениях → перезагрузил сервер командой reboot → зашёл обратно → запустил htop → закрыл → нажал стрелку вверх для повтора → там reboot (htop не сохранился!) → Enter на автомате → сервер ушёл в ребут 🤦

Мораль: осторожнее с исключениями и стрелкой вверх!

💡 Итог: правильная настройка history экономит часы при поиске той самой команды, которую вводил месяц назад.
____________________

Дополнительный материал:
🧠 - Btrfs: Революция Файловых Систем в Мире Linux
🧠 - Станьте мастером привилегий в Linux: Всё о sudo и su
🧠 - Docker Swarm & GitLab: Ускоряем Деплой Проектов с Шифрованием Секретов

#Linux_Mastery #linux #terminal #bash #productivity #sysadmin
👍23🔥2
SS: находим атакующих за 30 секунд

Эй, ловец сетевых пакетов!

Netstat устарел, в новых дистрибутивах его нет. Пора привыкать к SS. Делюсь рабочими командами и трюком, как запомнить ключи через слово "тулуп".

Базовые команды SS

Все открытые порты (запомни как "тулуп"):
# ss -tulnp


Проверка unix-сокетов:
# ss -l | grep .sock


Все unix-сокеты (но вывод перегружен):
# ss -ax


Активные соединения

# ss -ntu


Поиск атакующих — практика

Подсчёт соединений с каждого IP:
# ss -ntuH | awk '{print $6}' | grep -vE 127.0.0.1 | \
cut -d: -f1 | sort | uniq -c | sort -n | sed 's/^[ \t]*//'


Только IP с более 30 соединениями:
# ss -ntuH | awk '{print $6}' | grep -vE 127.0.0.1 | \
cut -d: -f1 | sort | uniq -c | sort -n | sed 's/^[ \t]*//' | \
awk '{if ($1 > 30) print$2}'


Общее количество активных соединений:
# ss -ntuH | awk '{print $6}' | grep -vE 127.0.0.1 | wc -l


Все соединения (не только активные):
# ss -ntua


Применение на практике

Получил список подозрительных IP? Отправляй их в:
- fail2ban
- ipset
- nftables

И блокируй атакующих автоматически!

Минус SS: в узком терминале вывод расползается. Приходится разворачивать окно на весь экран, в отличие от компактного netstat.

Лайфхак: "tulnp" = "тулуп". Глупо звучит, но реально помогает запомнить ключи навсегда.

💡 Итог: SS неудобнее netstat визуально, но работает быстрее и есть везде по умолчанию. Пора переучиваться.
____________________

Дополнительный материал:
🧠 - От Knoppix до MX Linux: Путешествие Debian-базированных Дистрибутивов
🧠 - Управление файлами и каталогами как профи
🧠 - Ваш путеводитель по командам Adduser и Addgroup в Linux

#Linux_Mastery #linux #terminal #networking #security #ddos
👍22
🔥 Fstab блокирует загрузку? Переходи на systemd

Привет, мастер монтирования!

Облачные провайдеры давно используют systemd для управления дисками в твоих виртуалках. Я однажды чуть не потерял данные, не зная этого.

👉 Показываю, как systemd заменяет fstab и почему это лучше

#Linux_Mastery #systemd #mount #linux #devops #storage
👍7👀4
💾 Потерял данные? Вот скрипт, который этого не допустит

Привет, хранитель данных!

Делаешь бэкапы вручную? Пора автоматизировать! Готовый bash-скрипт архивирует важные директории и отправляет на удалённый сервер. Настрой раз и спи спокойно.

Скрипт backup.sh

#!/bin/bash

backup_dirs=("/etc" "/home" "/boot")
dest_dir="/backup"
dest_server="server1"
backup_date=$(date +%b-%d-%y)

echo "Starting backup of: ${backup_dirs[@]}"

for i in "${backup_dirs[@]}"; do
sudo tar -Pczf /tmp/$i-$backup_date.tar.gz $i
if [ $? -eq 0 ]; then
echo "$i backup succeeded."
else
echo "$i backup failed."
fi
scp /tmp/$i-$backup_date.tar.gz $dest_server:$dest_dir
if [ $? -eq 0 ]; then
echo "$i transfer succeeded."
else
echo "$i transfer failed."
fi
done

sudo rm /tmp/*.gz
echo "Backup is done."


Как работает скрипт

Переменные:
- backup_dirs — массив директорий для бэкапа
- dest_dir — куда складывать на удалённом сервере
- dest_server — имя/IP целевого сервера
- backup_date — дата в имени архива

Процесс:
1. Архивирует каждую директорию в tar.gz
2. Отправляет по scp на удалённый сервер
3. Проверяет успешность каждого шага
4. Удаляет локальные временные архивы

Пример работы

kabary@handbook:~$ ./backup.sh
Starting backup of: /etc /home /boot
/etc backup succeeded.
etc-Aug-30-20.tar.gz 100% 1288KB 460.1KB/s 00:02
/etc transfer succeeded.
/home backup succeeded.
home-Aug-30-20.tar.gz 100% 2543KB 547.0KB/s 00:04
/home transfer succeeded.
/boot backup succeeded.
boot-Aug-30-20.tar.gz 100% 105MB 520.2KB/s 03:26
/boot transfer succeeded.
Backup is done.


Автоматизация через cron

Добавь в crontab для ежедневного запуска в 3 ночи:
0 3 * * * /home/user/backup.sh >> /var/log/backup.log 2>&1


💡 Совет: настрой SSH-ключи для scp без пароля, иначе скрипт не сработает в cron.

Результат: автоматические бэкапы критически важных данных каждую ночь. Никакой рутины, полная автоматизация.
____________________

Дополнительный материал:
🧠 - От первого контейнера до мощного Swarm: Путешествие Docker в мире DevOps
🧠 - Углубляемся в безопасность Linux: Специальные режимы и их мощь!
🧠 - Разгадываем тайны команды "Apropos": Ваш ключ к миру Linux Man Pages

#Linux_Mastery #bash #backup #automation #sysadmin #scripts
👍18
🔧 20+ переменных Bash, которые ты точно не использовал

Привет, повелитель скриптов!

Видел скрипты, где пути и настройки вбиты намертво? А потом ломаешь голову, почему они не работают на другой машине. Bash уже всё придумал за тебя — используй зарезервированные переменные.

📂 Навигация и окружение
$DIRSTACK — Содержимое вершины стека каталогов
$OLDPWD — Прежний рабочий каталог
$PATH — Путь поиска программ
$HOME — Домашний каталог пользователя

👤 Информация о пользователе
$UID — Содержит реальный идентификатор, который устанавливается только при логине
$EUID — Эффективный UID. Если вы использовали программу su для выполнения команд от другого пользователя, то эта переменная содержит UID этого пользователя
$GROUPS — Массив групп к которым принадлежит текущий пользователь

🖥️ Информация о системе
$HOSTNAME — hostname машины
$HOSTTYPE — Архитектура машины
$OSTYPE — Тип ОС

⚙️ Работа со скриптами и функциями
$EDITOR — Текстовый редактор по-умолчанию
$FUNCNAME — Имя текущей функции в скрипте
$SECONDS — Время работы скрипта (в сек.)
$$ — PID самого скрипта
$PPID — Идентификатор родительского процесса
$! — PID последнего запущенного в фоне процесса
$? — Содержит код завершения последней команды

📝 Работа с параметрами
$# — Общее количество параметров переданных скрипту
$* — Все аргументы переданные скрипту (выводятся в строку)
$@ — Тоже самое, что и предыдущий, но параметры выводятся в столбик

🔍 Дополнительные переменные
$LC_CTYPE — Внутренняя переменная, которая определяет кодировку символов

🔖 Сохрани шпаргалку — пригодится в каждом скрипте!

#Linux_Mastery #bash #scripting #linux #automation #devops #sysadmin
👍8🔥3