Последние посты

LinuxSkill - Сводки с прода и Шпаргалки
21 сент., 08:57
🎥 Вебинар: «Сможет ли ИИ починить Linux-сервер: где заканчиваются подсказки и начинается инженерная диагностика»Разберем реальный инцидент с Linux-сервером и попробуем найти причину проблемы с помощью ИИ. Посмотрим, какие рекомендации действительно помогают инженеру, какой информации не хватает модели и почему некоторые команды опасно выполнять без понимания состояния системы.О чем поговорим: - Разберем реальный инцидент с Linux-сервером и попробуем диагностировать его с помощью ИИ. - Проверим, какие рекомендации AI можно использовать, а какие требуют дополнительной проверки. - Сравним готовые команды с последовательной инженерной диагностикой и поиском первопричины. - Покажем, как безопасно применять ИИ для анализа логов, формирования гипотез и подготовки плана действий. - Разберем формат обучения, практические задания, поддержку преподавателей и итоговый проект курса.🧠 Вебинар


LinuxSkill - Сводки с прода и Шпаргалки
21 сент., 05:57
Добавить пользователя в группу и не выкинуть его при этом из sudoДобавить во вторичную группуusermod -aG developers lisaНюанс, ради которого стоит перечитать свои скрипты: без -a флаг -G не добавляет, а заменяет весь список. Было sudo,developers,ops — после usermod -G developers lisa осталось только developers. Ни ошибки, ни предупреждения, код возврата 0. Человек узнает об этом, когда в следующий раз наберёт sudo.Удалить из группыgpasswd -d bob developersПечатает Removing user bob from group developers. В отличие от usermod -G, трогает ровно одну группу.Сменить GID существующей группыgroupmod -g 2000 developers find / -xdev -nogroup 2>/dev/null chgrp -R developers /data
LinuxSkill - Сводки с прода и Шпаргалки
18 сент., 05:57
Собрать архив с исключениями и не обнаружить потом, что исключения не сработали.Исключить каталог из архиваtar --exclude='data/logs' -czf arch.tgz dataНюанс: --exclude обязан стоять до источника. Поставил после — tar честно предупредил --exclude 'data/logs' has no effect и всё равно упаковал логи. Второе: шаблон сравнивается с тем, как путь записан внутри архива. Упаковываете data, значит исключать надо data/logs, а не /tmp/ta/data/logs — с абсолютным путём совпадения не будет.Достать один файл из архиваtar -tf arch.tar | grep app.conf tar -xf arch.tar tmp/ta/data/conf/app.confНюанс: при упаковке по абсолютному пути tar срезает ведущий слеш и пишет Removing leading '/' from member names. Поэтому распаковать по тому же абсолютному пути не выйдет — получите Not found in archive. Сначала посмотрите список через -t, потом копируйте путь оттуда.Дописать или удалить файл в архиве
LinuxSkill - Сводки с прода и Шпаргалки
16 сент., 08:57
🎥 Вебинар: «Типовые задачи с RAID-массивами: создание, эксплуатация, перенос данных и восстановление»На открытом уроке разберем повседневные задачи, возникающие при работе с RAID-массивами: замену дисков, перенос данных на другой сервер и восстановление массива после сбоя. Обсудим, как собрать RAID из оставшихся дисков и в каких случаях восстановление данных возможно, а когда вернуть массив уже не получится.О чем поговорим: — Как создавать и эксплуатировать RAID-массивы — Как правильно менять вышедшие из строя диски — Как собрать массив из оставшихся рабочих дисков — Как перенести данные на другой сервер — Как восстанавливать RAID после сбоя и оценивать вероятность успешного восстановления🧠 Вебинар приурочен к старту курса «Администратор Linux. Продвинутый уровень». Программа постоянно обновляется с учётом современных требований рынка. Занятия проводят практикующие эксперты,
1,010Открыть в Telegram
LinuxSkill - Сводки с прода и Шпаргалки
16 сент., 05:57
Собрать дерево каталогов одной строкой и не получить папку с фигурными скобками в имени.Создать вложенную структуруmkdir -p project/src/{configs,utils,tests}Нюанс: раскрытие скобок — фича bash, а не mkdir. В sh строка отработает буквально, создав каталог с именем {configs,utils,tests} — проверил, ошибки при этом никакой. То же будет от пробела после запятой и от одного элемента без запятой: {only} останется как есть.Если скрипт начинается с #!/bin/sh, скобки не использовать.Вернуться в предыдущий каталогcd -Нюанс: cd - печатает путь в stdout. В скрипте это мусор в выводе, а $(cd -) вообще бесполезен — подстановка уходит в подоболочку, и рабочий каталог самого скрипта не меняется. Для скриптов тише так:cd "$OLDPWD"Ходить по каталогам стеком
LinuxSkill - Сводки с прода и Шпаргалки
14 сент., 05:57
Не оставить пароль в bash_history и не удивиться, что он всё равно там оказался.Скрыть команду от историиmysql -u root -p'super_secret'Ведущий пробел, и строка не попадёт в ~/.bash_history. Работает, если в HISTCONTROL есть ignorespace. Нюанс: в Ubuntu это уже настроено, но по-разному. В /etc/skel/.bashrc стоит ignoreboth, а в root-сессии у меня было ignoredups:ignorespace. Проверьте своё:echo "$HISTCONTROL"Если пусто — трюк не сработает вообще, а вы будете уверены в обратном.Исправить опечатку в предыдущей командеsystemctl status nginx-confg ^confg^configЗаменяет и сразу выполняет. Нюанс: только первое вхождение. Проверил на echo aaa bbb aaa — после ^aaa^XXX получилось XXX bbb aaa. Для всех вхождений другая конструкция:!!:gs/aaa/XXX/
LinuxSkill - Сводки с прода и Шпаргалки
11 сент., 05:57
Смонтировать сетевую шару и не подвесить процессы, когда сервер отвалится.Убрать пароль из fstabmount -t cifs -o credentials=/etc/cifs-creds \ //10.0.0.10/share /mnt/sambaФайл /etc/cifs-creds из трёх строк: username=, password=, domain=. Нюанс: chmod 600 на нём — целиком на вашей совести, mount права не проверяет и с файлом 644 отработает молча. Заодно проверьте, что каталог с ним не уезжает в бэкап открытым текстом.Отцепить зависшую шаруumount -l /mnt/nfsПроверил на tmpfs: после -l каталог пуст и монтирования в mount больше нет, но процесс, державший файл открытым, спокойно дочитал его по старому дескриптору. Нюанс: -l убирает точку из дерева, а не освобождает ресурсы — пока живы процессы, ФС остаётся. Ищите их через lsof +D до того, как отцепите, иначе искать будет негде.-f имеет смысл только для NFS и только вместе с недоступным сервером, для cifs он почти ничего не
LinuxSkill - Сводки с прода и Шпаргалки
9 сент., 08:57
🎥 Вебинар: Где Linux хранит настройки и логи: разбираем файловую структуру на практике.На открытом уроке разберем структуру каталогов Linux и узнаем, где искать конфигурационные файлы, системные журналы и другие важные данные. Рассмотрим назначение основных директорий и вспомним, как права доступа влияют на работу с файлами. Данный открытый урок проходит в рамках курса «Администратор Linux. Базовый уровень».О чем поговорим: — Как устроена файловая структура Linux — Для чего предназначены основные системные каталоги — Что такое конфигурационный файл и где обычно хранятся настройки сервисов — Где Linux хранит системные логи и как найти нужный журнал — Как права доступа влияют на чтение и изменение файлов🧠 Вебинар приурочен к старту курса «Администратор Linux. Базовый уровень». Вы освоите Bash, TCP/IP, Nginx, Apache, MySQL, Docker, Git, Prometheus, Grafana и ELK. На живых занятиях с


LinuxSkill - Сводки с прода и Шпаргалки
9 сент., 05:57
Найти на сервере скрытых рутов и не поверить проверке, которая их не видит.Найти лишние учётки с нулевым UIDgetent passwd | awk -F: '($3 == 0) {print $1}'Нюанс: в подборках пишут awk -F: '($3 == "0")' — со строковым сравнением. Оно пропускает UID, записанный как 00 или 0000. Проверил: завёл пользователя с -u 00, id показал uid=0(root), то есть для ядра это полноценный рут, а строковая проверка его не увидела. Без кавычек awk сравнивает числа и ловит все варианты.getent вместо cat /etc/passwd нужен, чтобы захватить пользователей из LDAP и SSSD.Убедиться, что root не пускают по SSHsshd -T | grep -i permitrootloginНюанс, и он главный. grep по /etc/ssh/sshd_config показывает то, что написано, а не то, что действует. Собрал стенд: в основном конфиге PermitRootLogin no, а в /etc/ssh/sshd_config.d/99-cloud.conf — yes. Строка Include стоит выше, drop-in побеждает:grep -> PermitRo
LinuxSkill - Сводки с прода и Шпаргалки
7 сент., 05:57
Выкинуть из скрипта форки awk и cut и не нарваться на подстановку, которая молчитРазобрать путь без basename и dirnamepath="/var/log/nginx/access.log.tar.gz" name="${path##/}" # access.log.tar.gz dir="${path%/}" # /var/log/nginxЗамерил тысячу итераций в цикле: basename — 1107 мс, подстановка — 5 мс. Разница в двести раз, и это не про скорость самой утилиты, а про форк процесса на каждый вызов.Собрать файлы в массив вместо lsshopt -s nullglob files=(/var/log/nginx/.log) cp -- "${files[@]}" /backup/logs/Нюанс: без nullglob массив по несуществующей маске не пустой. Проверил — в нём оказался один элемент, сама строка /var/log/nginx/.nosuch, и cp уедет с несуществующим файлом. shopt -s nullglob заставляет пустой glob разворачиваться в ноль элементов.Сравнить вывод двух команд без временных файлов
LinuxSkill - Сводки с прода и Шпаргалки
4 сент., 05:57
Обойти массив путей с пробелами и не получить вместо одной папки три несуществующих.Перебрать элементы, не разорвав их по пробеламfolders=("/var/log/nginx" "/var/log/app with space") for d in "${folders[@]}"; do ls -ld "$d" doneКавычки вокруг ${folders[@]} обязательны. Без них тот же цикл на моём тесте выдал четыре итерации вместо двух: путь распался на /var/log/app, with и space. И не путай @ с : под кавычками "${folders[]}" склеивает весь массив в одну строку.Посчитать элементыecho "${#folders[@]}"Нюанс: ${#folders} без [@] — это не размер массива, а длина первого элемента. У меня вернуло 8 вместо 3, и никакой ошибки.Обойти разреженный массивfor i in "${!sparse[@]}"; do
LinuxSkill - Сводки с прода и Шпаргалки
2 сент., 08:57
🎥 Вебинар: «LVM без простоя: расширение тома, перенос данных и аварийный откат через snapshot»На открытом уроке разберем, как использовать возможности LVM при работе с хранилищем в production-среде. Рассмотрим расширение логического тома, перенос данных на другое блочное устройство и применение snapshot для возврата к предыдущему состоянию системы.О чем поговорим: — Как устроен LVM и какие задачи он помогает решать — Как расширять логические тома при увеличении объема данных — Как перенести данные на другое блочное устройство — Что такое snapshot и как он работает — Как использовать snapshot для отката при возникновении проблем🧠 Вебинар приурочен к старту курса «Администратор Linux. Продвинутый уровень». Программа постоянно обновляется с учётом современных требований рынка. Занятия проводят практикующие эксперты, которые ежедневно работают с производственной инфраструктурой. Вы


LinuxSkill - Сводки с прода и Шпаргалки
2 сент., 05:57
Прокинуть скрипт и каталог на сервер и не собрать по дороге чужие абсолютные пути Всё проверено на OpenSSH 9.6p1, подключением к живому sshd.Увидеть, какие параметры реально применилисьssh -G user@hostОтдаёт итоговый конфиг после разбора всех Host и Match: порт, пользователя, список шифров, таймауты. Быстрее, чем перечитывать ~/.ssh/config глазами и гадать, какая секция сработала. Если сессия висит — ssh -vvv покажет, на каком этапе.Выполнить локальный скрипт на сервереssh user@host bash -s arg1 arg2 < ./script.shНюанс: -s обязателен, если передаёшь аргументы. Без него bash примет arg1 за имя файла и ответит No such file or directory. И второе: интерактивный read внутри такого скрипта работать не будет — stdin уже занят самим скриптом.Убрать устаревший ключ хостаssh-keygen -f ~/.ssh/known_hosts -R '[10.0.0.1]:2222'Нюанс: для нестандартного порта нужен формат
LinuxSkill - Сводки с прода и Шпаргалки
31 авг., 05:57
Сервис упал ночью, до утра гигабайт логов. Порядок, в котором в них лезтьНачать с ошибок текущей загрузкиjournalctl -p err -b-b отсекает всё, что было до последней перезагрузки, -p err оставляет уровень Error и выше. Цифровой вариант -p 3 делает то же самое, но словом читается лучше.Сузить окно до времени инцидентаjournalctl --since "2026-08-13 23:00:00" \ --until "2026-08-14 01:00:00"Нюанс: форматы вроде yesterday 23:00:00, которые кочуют по подборкам, systemd не разбирает — получишь Failed to parse timestamp. Проверил на systemd 255: отдельно yesterday работает, -2h работает, 23:00 работает, а вот их комбинация — нет. Надёжнее всегда писать полную дату.Посмотреть, не прибило ли сервис ядроdmesg -T --level=err,warn dmesg -T | grep -i oom-killer
LinuxSkill - Сводки с прода и Шпаргалки
28 авг., 05:57
Диски гостей раздулись, а внутри места полно. Вернуть его хосту — и не просадить записьПроверить, поддерживает ли диск discardlsblk --discardНюанс: в подборках советуют hdparm -I /dev/sda | grep -i trim. На virtio-диске это не сработает вовсе — у меня вернуло Operation not permitted, потому что hdparm говорит по протоколу ATA, которого у виртуального диска нет. lsblk --discard показывает нужное для любого типа:NAME DISC-GRAN DISC-MAX vda 4K 1G vdb 0B 0BНенулевые DISC-GRAN и DISC-MAX означают, что discard проходит. Нули — гипервизор его не отдаёт, дальше можно не настраивать.Отдать блоки хосту прямо сейчасfstrim -av --dry-run fstrim -avСначала --dry-run: он делает всё то же самое, но без самого discard. У меня показал 0 B (dry run) trimmed on /dev/vda, а боевой запуск вернул 243.1 GiB trimmed.
LinuxSkill - Сводки с прода и Шпаргалки
26 авг., 05:57
Как достать пароль из kdbx, когда графика легла и буфер обмена недоступен Всё проверено на keepassxc-cli 2.7.6 из репозитория Ubuntu 24.04.Посмотреть, что вообще есть в базеkeepassxc-cli ls -R database.kdbxНюанс: без -R увидишь только верхний уровень. Вложенные записи в группах не покажет — легко решить, что база пустая.Вытащить конкретный пароль в терминалkeepassxc-cli show -a Password database.kdbx "Production/DB"Нюанс: обычный show без ключей выводит Password: PROTECTED вместо значения. Флаг -s раскрывает все поля, -a Password отдаёт только пароль одной строкой — удобно подставлять в скрипт.Открыть базу с файлом ключейkeepassxc-cli ls -k keyfile.key database.kdbxТот же -k работает во всех подкомандах. Если пароля на базе нет вообще, добавь --no-password, иначе утилита будет ждать ввода.
LinuxSkill - Сводки с прода и Шпаргалки
24 авг., 05:57
Если гоняешь ansible по сотне серверов, SSH каждый раз делает хендшейк зановоПереиспользовать одно TCP-соединение# ~/.ssh/config Host ControlMaster auto ControlPath ~/.ssh/sockets/%C ControlPersist 10mЗамерил на локальном sshd: первое подключение 0.22 секунды, второе и третье — по 0.01. Разница в двадцать раз, и это на loopback, где сети как таковой нет. На реальном канале с задержкой выигрыш будет больше.Каталог ~/.ssh/sockets надо создать заранее, сам он не появится.Не упереться в лимит длины путиНюанс: %C тут не для красоты. Классический %r@%h:%p на длинных именах хостов выходит за предел, и ssh отказывается работать:ControlPath too long ('/root/.ssh/sockets/xxx... -root@127.0.0.1:2222' >= 108 bytes)
LinuxSkill - Сводки с прода и Шпаргалки
21 авг., 05:57
Пробросить TCP через WebSocket мимо DPI и не собрать по дороге утечку сокетовwebsocat — консольный клиент вебсокетов на Rust, авторства Виталия Шукелы. Соединение начинается с обычного HTTP-рукопожатия Upgrade, поэтому фильтр видит легитимный веб-трафик. Проверял на версии 1.14.0, скачанной статическим бинарником с релизов.Пробросить локальный TCP-порт в вебсокетwebsocat --binary -E \ tcp-l:127.0.0.1:8080 ws://example.com/socketНюанс: без -E websocat печатает предупреждение про утечку сокетов при обслуживании нескольких клиентов. У меня оно вылезало на каждом запуске туннеля, с флагом лог чистый.Держать сессию живой на нестабильной сетиwebsocat -t --ping-interval 10 \ - autoreconnect:ws://example.com/socketНюанс: autoreconnect: требует двух аргументов. Вариант с одним, который ходит по подборкам, падает: Specify ws:// or wss:// URI to connect to a websocket. Первым
LinuxSkill - Сводки с прода и Шпаргалки
19 авг., 05:57
Закрыть системные файлы от правки и не получить молча сломанный useraddЗапретить правку файла даже рутуchattr +i /etc/passwdНюанс: useradd после этого выдаёт cannot open /etc/passwd и завершается с кодом 0. Пользователь не создаётся, скрипт не падает, мониторинг молчит. Снял атрибут — создался.Разрешить логу только дозаписьchattr +a /var/log/secureНюанс: ротация делается переименованием, а его атрибут не пускает. Запустил logrotate на таком файле:error: failed to rename: Operation not permitted rc=0Снова ноль на выходе. Файл не ротировался, cron считает, что всё прошло, логи растут до конца места.Найти файлы с SUID и SGID
LinuxSkill - Сводки с прода и Шпаргалки
17 авг., 05:57
Посмотреть, какие интерфейсы подняты, и не принять погасший порт за живойКраткий статус интерфейсовip -4 -br address show upНюанс: up фильтрует по состоянию линка, а не по наличию адреса. Погасил eth0 — с ключом он пропал из вывода совсем, без ключа виден как DOWN со всеми адресами на месте. Пустая строка тут не значит «адреса нет».Второй адрес без алиасов вида eth0:1ip address add 10.0.0.50/24 dev eth0 ip address del 10.0.0.50/24 dev eth0Второй адрес встаёт рядом с первым, при удалении линк не дёргается.Узнать, куда реально пойдёт пакетip route get 8.8.8.8 # 8.8.8.8 via 192.0.2.1 dev eth0 src 192.0.2.2
